Go 的流程控制引入了一些新的概念,而不使用 do 或 while。像是 for 循环、清楚又靈活的switch、初始化語句以及 select 語句,這些特性使Go更適合處理併發和精簡化程式碼。
簡單的討論 Effective Go ,我們會繼續細談。
什麼是流程控制?
先說流程:假設現在要去看電影,「要先查手機最近的地點,再搜尋時間,到了後要到櫃台買票、選座位、用什麼方式付款,最後完成購票程序。」這是有順序的執行過程。我們稱之為流程。
再談控制:流程執行時,可能為因為外在狀況而有不同的執行方式「現在在北車,可以去哪裡看。如果在中壢,就去威尼斯...。」
if 和 switch(後面會講解) 可初始化, 故常看到他們被拿來設置局部變量。
當 if 語句不會執行到下一個條件時,也就是說 if 後面的 {} 裡面的內容,以 break、continue、goto 或 return 結束時,不必要的 else 會被省略。
程式碼必须防範錯誤的條件。如果流程成功無中斷,代表沒有或著已排除錯誤。如果出錯,將以 return 結束,後面的 else 也不會執行了。
要先聲明才能使用,從上到下逐一執行。
func main(){
    var numl = 100            // 聲明變量 numl
    var num2 int = numl + 150 // 使用變量 numl
    fmt.Printn(num2)
    // 不能使用後才聲明,這是沒用的!
}
func main(){    
    程式碼 1
    程式碼 2
    程式碼 3
    // 會依照流程圖,一步一步往下走。
}
if
如果 條件為真 {
    執行這裡
}
price := 1000            // 聲明變量,電影票為 $1000
if price > 300 {         // 如果電票 >300,太貴就不看
    fmt.Println("不看")
}
Go 也可以在一個 if 中,直接定義變量。且如果符合邏輯,會執行{}的內容。
if price := 1000; price > 300{
    fmt.Println("不看")
}
if else
time := 18
if time > 18{
    fmt.Println("早就下班了")
} else {
    fmt.Println("作夢吧你!快上班")
}
if  else if
km := 38
if km == 42 {
    fmt.Println("恭喜完成全馬!")
} else if km >21 && km <= 42 {
    fmt.Println("恭喜超過半馬!")
} else if km >10 && km <= 20 {
    fmt.Println("很會休閒散步!")
} else if km >5 && km <= 9 {
    fmt.Println("志在參加!")
} else {
    fmt.Println("專攻補給品!")
}
請問會印出什麼?
如果一段程式碼先前已經有聲明變數了,即可再次對變數賦值。
兩個語句都出現 err, 在第一條程式碼中被聲明了,而在第二條程式碼中只是被再次赋值。也就是 a.Stat 使用的是前面已經聲明的 err,它只是被重新赋值而已。
a, err := os.Open(num)
h, err := a.Stat()
Go 裡面沒有 do-while ,而統一了 for while。官網指出有這些寫法。
for 初始聲明; 條件敘述; post { }
for { }
// 像是 while 的迴圈
for 條件敘述 { }

for 初始化聲明; 條件敘述; 後置敘述 {
    // 迴圈
}
for i := 0; i < 5; i++ {
    fmt.Println(i)
}
印出
0 1 2 3 4
而使用無限循環時,就要搭配 break 來跳出程式:
for i := 0; i < 10; i++ {
    if i == 5 {
        break // 當 i 等於 5 時,跳出
    }
    fmt.Println(i)
}
for range 可以在每次迴圈迭代中得到集合中的索引和對應的元素值,或者只得到元素值。
for index, element := range collection {
}
可以對 slice:
numbers := []int{1, 2, 3, 4, 5}
for index, value := range numbers {
    fmt.Printf("Index: %d, Value: %d\n", index, value)
}
可以對 map :
person := map[string]string{
    "name":  "Alice",
    "email": "alice@example.com",
}
for key, value := range person {
    fmt.Printf("Key: %s, Value: %s\n", key, value)
}
可以對 string :
text := "Hello, 世界"
for index, char := range text {
    fmt.Printf("Position: %d, Character: %c\n", index, char)
}
也可以對 channel :
ch := make(chan int)
go func() {
    for i := 0; i < 5; i++ {
        ch <- i
    }
    close(ch)
}()
for value := range ch {
    fmt.Println("Received:", value)
}
今天寫得很倉促,時間分配沒有掌握好,但畫圖很快樂,後續再接再厲。