Golang學習-CH4 Go語言流程控制
- 4.1 Go語言if-else分支結構
- 4.2 Go語言for迴圈結構
- 4.3 Go語言for range(鍵值迴圈)
- 4.4 Go語言switch case語句
- 4.5 Go語言goto語句——跳轉到指定的標籤
- 4.6 Go語言break(跳出迴圈)
- 4.7 Go語言continue(繼續下一次迴圈)
4.1 Go語言if-else分支結構
if condition1 { // do something } else if condition2 { // do something else }else { // catch-all or default }
關鍵字 if 和 else 之後的左大括號{
必須和關鍵字在同一行,如果你使用了 else if 結構,則前段程式碼塊的右大括號}
必須和 else if 關鍵字在同一行,這兩條規則都是被編譯器強制規定的。
特殊寫法:可以在 if 表示式之前新增一個執行語句,再根據變數值進行判斷
if err := Connect(); err != nil {
fmt.Println(err)
return
}
這種寫法可以將返回值與判斷放在一行進行處理,而且返回值的作用範圍被限制在 if、else 語句組合中。
在程式設計中,變數的作用範圍越小,所造成的問題可能性越小。
4.2 Go語言for迴圈結構
Go語言中的迴圈語句只支援 for 關鍵字,而不支援 while 和 do-while 結構
sum := 0
for i := 0; i < 10; i++ {
sum += i
}
-
左花括號
{
必須與 for 處於同一行。 -
Go語言中的 for 迴圈與C語言一樣,都允許在迴圈條件中定義和初始化變數,唯一的區別是,Go語言不支援以逗號為間隔的多個賦值語句,必須使用平行賦值的方式來初始化多個變數。
-
Go語言的 for 迴圈同樣支援 continue 和 break 來控制迴圈,但是它提供了一個更高階的 break,可以選擇中斷哪一個迴圈。
JLoop: //解決了C++中break跳兩層迴圈時需要標識變數的問題 for j := 0; j < 5; j++ { for i := 0; i < 10; i++ { if i > 5 { break JLoop } fmt.Println(i) } }
-
Go語言無限死迴圈
var i int //C 風格 for ; ; i++ { if i > 10 { break } } //go為了解決上述C風格 for { if i > 10 { break } i++ }
-
只有一個迴圈條件的迴圈
//類似while var i int for i <= 10 { i++ }
4.3 Go語言for range(鍵值迴圈)
for range 結構是Go語言特有的一種的迭代結構,在許多情況下都非常有用,for range 可以遍歷陣列、切片、字串、map 及通道(channel),for range 語法上類似於其它語言中的 foreach 語句
for key, val := range coll {
...
}
//迭代遍歷字串:能夠自動根據 UTF-8 規則識別 Unicode 編碼的字元。
for pos, char := range str {
...
}
需要注意:val 始終為集合中對應索引的值拷貝,因此它一般只具有隻讀性質,對它所做的任何修改都不會影響到集合中原有的值。
遍歷通道:
for range 可以遍歷通道(channel),但是通道在遍歷時,只輸出一個值,即管道內的型別對應的資料。
c := make(chan int)
go func() {
c <- 1
c <- 2
c <- 3
close(c)
}()
for v := range c {
fmt.Println(v) //不斷地從通道中取資料,直到通道被關閉。
}
4.4 Go語言switch case語句
Go語言的 switch 要比C語言的更加通用,表示式不需要為常量,甚至不需要為整數,case 按照從上到下的順序進行求值,直到找到匹配的項,如果 switch 沒有表示式,則對 true 進行匹配,因此,可以將 if else-if else 改寫成一個 switch。
Go語言改進了 switch 的語法設計,case 與 case 之間是獨立的程式碼塊,不需要通過 break 語句跳出當前 case 程式碼塊以避免執行到下一行
解決了C++中常要寫break的痛點
基本寫法
var a = "hello"
switch a {
case "hello":
fmt.Println(1)
case "world":
fmt.Println(2)
default:
fmt.Println(0)
}
Go語言規定每個 switch 只能有一個 default 分支。
一分支多值
var a = "mum"
switch a {
case "mum", "daddy":
fmt.Println("family")
}
不同的 case 表示式使用逗號分隔。
分支表示式
var r int = 11
switch { //switch後臨界大括號
case r > 10 && r < 20:
fmt.Println(r)
}
注意,這種情況的 switch 後面不再需要跟判斷變數。某種程度上已經完全可以替代if-else
跨越 case 的 fallthrough
在Go語言中 case 是一個獨立的程式碼塊,執行完畢後不會像C語言那樣緊接著執行下一個 case,但是為了相容一些移植程式碼,依然加入了 fallthrough 關鍵字來實現這一功能
var s = "hello"
switch {
case s == "hello":
fmt.Println("hello")
fallthrough
case s != "world":
fmt.Println("world")
}
//輸出結果:
//hello
//world
新編寫的程式碼,不建議使用 fallthrough。
4.5 Go語言goto語句——跳轉到指定的標籤
err := firstCheckError()
if err != nil {
goto onExit
}
err = secondCheckError()
if err != nil {
goto onExit
}
fmt.Println("done")
return
onExit:
fmt.Println(err)
exitProcess()
4.6 Go語言break(跳出迴圈)
Go語言中 break 語句可以結束 for、switch 和 select 的程式碼塊,另外 break 語句還可以在語句後面新增標籤,表示退出某個標籤對應的程式碼塊,標籤要求必須定義在對應的 for、switch 和 select 的程式碼塊上。
單break的用法也仍然存在。
func main() {
OuterLoop:
for i := 0; i < 2; i++ {
for j := 0; j < 5; j++ {
switch j {
case 2:
fmt.Println(i, j)
break OuterLoop
case 3:
fmt.Println(i, j)
break OuterLoop
}
}
}
}
4.7 Go語言continue(繼續下一次迴圈)
Go語言中 continue 語句可以結束當前迴圈,開始下一次的迴圈迭代過程,僅限在 for 迴圈內使用,在 continue 語句後新增標籤時,表示開始標籤對應的迴圈。
單continue的用法也仍然存在。
package main
import "fmt"
func main() {
OuterLoop:
for i := 0; i < 2; i++ {
for j := 0; j < 5; j++ {
switch j {
case 2:
fmt.Println(i, j)
continue OuterLoop
}
}
}
}