初學 Golang 30 天 - (6)控制結構

1. For

Go 只有一種迴圈 ——「 for 」 。

基本的「 for 」迴圈除了沒有了 「 ( ) 」 之外(甚至強制不能使用它們),它看起來跟 C 或者 Java 中做的一樣,而 「 { } 」 是必須的。

範例程式碼

package main

import "fmt"

func main() {
    sum := 0
    for i := 0; i < 10; i++ {
        sum += i
    }
    fmt.Println(sum)
}

輸出結果
http://play.golang.org/p/TxCWviFuml

45

跟 C 或者 Java 中一樣,可以讓前置、後置語句為空。

範例程式碼

package main

import "fmt"

func main() {
    sum := 1
    for ; sum < 1000; {
        sum += sum
    }
    fmt.Println(sum)
}

輸出結果
http://play.golang.org/p/5muwB33C21

1024 

2. for 是 Go 的 「while」

基於此可以省略分號:C 的 while 在 Go 中叫做 「for」。

範例程式碼

package main

import "fmt"

func main() {
    sum := 1
    for sum < 1000 {
        sum += sum
    }
    fmt.Println(sum)
}

輸出結果
http://play.golang.org/p/JOC0_-6_Ti

1024

3. 無窮迴圈

如果省略了迴圈條件,迴圈就不會結束,因此可以用更簡潔地形式表達無窮迴圈。

範例程式碼

package main

func main() {
    for {
    }
}

輸出結果

[process took too long]

4. if

if 語句除了沒有了「 ( ) 」 之外(甚至強制不能使用它們),看起來跟 C 或者 Java 中的一樣,而 「 { } 」 是必須的。

範例程式碼

package main

import (
    "fmt"
    "math"
)

func sqrt(x float64) string {
    if x < 0 {
        return sqrt(-x) + "i"
    }
    return fmt.Sprint(math.Sqrt(x))
}
func main() {
    fmt.Println(sqrt(2), sqrt(-4))
}

輸出結果
http://play.golang.org/p/_CR_GD8MaJ

1.4142135623730951 2i

5. if 簡短的敘述

跟「 for 」一樣,「 if 」 語句可以在條件之前執行一個簡單的語句。
由這個語句定義的變數的作用範圍僅在「 if 」範圍之內。
(在最後的 return 語句處使用 v 看看。)

範例程式碼

package main

import (
    "fmt"
    "math"
)

func pow(x, n, lim float64) float64 {
    if v := math.Pow(x, n); v < lim {
        return v
    }
    return lim
}

func main() {
    fmt.Println(
        pow(3, 2, 10),
        pow(3, 3, 20),
    )
}

輸出結果
http://play.golang.org/p/Bky05gYuK1

9 20

6. if 和 else

在「 if 」的簡短敘述定義的變數同樣可以在任何對應的「 else 」區塊中使用。
範例程式碼

package main

import (
    "fmt"
    "math"
)

func pow(x, n, lim float64) float64 {
    if v := math.Pow(x, n); v < lim {
        return v
    } else {
        fmt.Printf("%g >= %g\n", v, lim)
    }
    // can't use v here, though

    return lim
}

func main() {
    fmt.Println(
        pow(3, 2, 10),
        pow(3, 3, 20),
    )
}

輸出結果
http://play.golang.org/p/HPEC3aWQTx

27 >= 20
9 20 

7. Switch

Switch 是比 if 更有閱讀性的控制結構,跟 C 語言不同的是他不需要「 break 」來跳出。
注意,如果使用「 fallthrough 」關鍵字,會執行下一個 Case。
另外 Switch 後的陳述不是必須的,你可以寫 Case 裡面。

範例程式碼

package main

import "fmt"

func choose(i int) {
    switch i {
    case 1:
        fmt.Println("1")
    case 2, 3:
        fmt.Println("2 or 3")
    case 4:
        fallthrough
    case 5:
        fmt.Println("5")
    }
}

func anotherChoose(i int) {
    switch  {
    case i > 5:
        fmt.Println(i, "> 5")
    case i < 5:
        fmt.Println(i, "< 5")
    case i == 5:
        fmt.Println(i, "= 5")
    }
}



func main() {

    choose(1)
    choose(3)
    choose(4)

    anotherChoose(6)
}

輸出結果
http://play.golang.org/p/8iW8_wtw89

1
2 or 3
5
6 > 5

8. goto

Go 語言跟 C 語言一樣也有「 goto 」,但是不建議使用,會讓程式的結構變得很糟糕。

範例程式碼

package main

import "fmt"

func main() {
    i := 0
HERE:
    fmt.Print(i)
    i++
    if i < 10 {
        goto HERE
    }
}

輸出結果
http://play.golang.org/p/eW9L2xiT_6

0123456789
comments powered by Disqus