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)
}
今天寫得很倉促,時間分配沒有掌握好,但畫圖很快樂,後續再接再厲。