這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
流程式控制制是改變程式運行順序的指令,可能是運行不同位置的指令,或是在二段(或多段)程式中選擇一個運行。程式設計語言的流程式控制制語句,用於設定計算執行的次序,建立程式的邏輯結構。可以說, 流程式控制制語句是整個程式的骨架。
條件陳述式
條件判斷是依指定變數或運算式的結果,決定後續啟動並執行程式,可以根據指定條件是否成立,決定後續的程式。
對於 Go條件陳述式,提供了兩種方式:
- 單一條件判斷:if-else,也可以組合多個if-else指令,進行較複雜的條件判斷。
- 多選一條件判斷:switch-case。
if else
Go的if語句由一個布林運算式後緊跟一個或多個語句組成。if 語句後可以使用可選的 else 語句, else 語句中的運算式在布林運算式為 false 時執行。
通常格式為:
if 布林運算式 { /* 在布林運算式為 true 時執行 */} else { /* 在布林運算式為 false 時執行 */}
其中,Go 的 if 語句運算式外無需小括弧 ( ) ,而大括弧 { } 則是必須的。同時 {必須緊跟在if語句,不可換行,否則編譯或報錯–missing condition in if statement。
如下代碼:
package mainimport "fmt"func main() { /* 定義局部變數 */ a := 10 /* 使用 if 語句判斷布林運算式 */ if a < 20 { /* 如果條件為 true 則執行以下語句 */ fmt.Printf("a 小於 20\n") } else { /* 如果條件為 false 則執行以下語句 */ fmt.Printf("a 不小於 20\n") } fmt.Printf("a 的值為 : %d\n", a)}
除此之外,Go的 if 或 else if 語句可以嵌入一個或多個 if 或 else if 語句。
package mainimport "fmt"func main() { /* 定義局部變數 */ var a int = 100 var b int = 200 /* 判斷條件 */ if a == 50 { fmt.Printf("a 值為: %d\n", a) } else if a == 100 { /* if 條件陳述式為 true 執行 */ if b == 200 { /* if 條件陳述式為 true 執行 */ fmt.Printf("a 的值為 100 , b 的值為 200\n") } } fmt.Printf("a 值為 : %d\n", a) fmt.Printf("b 值為 : %d\n", b)}
if 的簡短語句
if 語句可以在條件運算式前執行一個簡單的語句。
package mainimport ( "fmt" "math")func pow(x, n, lim float64) { if v := math.Pow(x, n); v < lim { fmt.Printf("1.math.Pow(%f, %f):%f \n", x, n, v) } else { fmt.Printf("2.math.Pow(%f, %f):%f \n", x, n, v) } fmt.Println(lim)}func main() { pow(3, 2, 10) pow(3, 3, 20)}
這裡在if判斷運算式之前定義了一個變數v並初始化賦值。需要說明的是該語句聲明的變數範圍僅在 if 之內。
switch case
Go的switch和其他語言功能基本一致,都是用於基於不同條件執行不同動作,每一個 case 分支都是唯一的,從上直下逐一測試,直到匹配為止。
具體文法也有Go的特色:
- 首先匹配項後面也不需要再加break
- switch後面的運算式不是必須的
- case 裡可以寫運算式
- 單個case中,可以出現多個結果選項
- 左花括弧{必須與switch處於同一行。這點在Go裡很普遍
有一個特殊關鍵字fallthrough,若且唯若在case中明確添加fallthrough關鍵字,才會繼續執行緊跟的下一個case
一般情況,Go 程式設計語言中 switch 語句的文法如下:
switch var1 { case val1: ... case val2: ... default: ...}
變數 var1 可以是任何類型,而 val1 和 val2 則可以是同類型的任意值。類型不被局限於常量或整數,但必須是相同的類型;或者最終結果為相同類型的運算式。
package mainimport "fmt"func main() { /* 定義局部變數 */ var grade string = "B" var marks int = 90 switch marks { case 90: grade = "A" case 80: grade = "B" case 50, 60, 70: grade = "C" default: grade = "D" } switch { case grade == "A": fmt.Printf("優秀!\n") case grade == "B", grade == "C": fmt.Printf("良好\n") case grade == "D": fmt.Printf("及格\n") case grade == "F": fmt.Printf("不及格\n") default: fmt.Printf("差\n") } fmt.Printf("你的等級是 %s\n", grade)}
上面第一個switch中,和其他常見語言中的文法上switch基本一致。在第二個中就比較具有Go的特色。switch後面沒有運算式,case語句也可以使用運算式來判斷
package mainimport "fmt"func main() { /* 定義局部變數 */ var grade string = "B" switch { case grade == "A": fmt.Printf("優秀!\n") fallthrough case grade == "B", grade == "C": fmt.Printf("良好\n") fallthrough case grade == "D": fmt.Printf("及格\n") case grade == "F": fmt.Printf("不及格\n") fallthrough default: fmt.Printf("差\n") } fmt.Printf("你的等級是 %s\n", grade)}
可以看出,語句成立後,如果加了fallthrough,下一條case就會被執行。
迴圈語句
Go語言中的迴圈語句只支援for關鍵字,不支援while和do-while 結構,可是有些寫法卻可是實作類別似功能。關鍵字for的基本使用方法與C和C++中非常接近。
基本的 for 迴圈由三部分組成,它們用分號隔開:
- 初始化語句:在第一次迭代前執行
- 條件運算式:在每次迭代前求值
- 後置語句:在每次迭代的結尾執行
基本形式
Go語言的for迴圈有3中形式
1、for init; condition; post { }
注意條件陳述式也是不需要()的。
package mainimport "fmt"func main() { sum := 0 for i := 0; i <= 100; i++ { sum += i } fmt.Println(sum)}
上面代碼實現了1加到100的運算。
2、for condition { }
這個實現的有些像 while ,只要條件成立就一直執行。
package mainimport "fmt"func main() { var b int = 15 var a int = 10 for a < b { a++ fmt.Printf("a 的值為: %d\n", a) }}
3、for { }
這樣定義,實際上就是無限迴圈了。如果省略迴圈條件,該迴圈就不會結束。
對於for的條件,還可以使用range 格式可以對 slice、map、數組、字串等進行迭代迴圈。
for的range
for key, value := range oldMap { newMap[key] = value}
package mainimport "fmt"func main() { numbers := [6]int{1, 2, 3, 5} for i, x := range numbers { fmt.Printf("第 %d 位 x 的值 = %d\n", i, x) }}
迴圈控制語句
GO 語言支援以下幾種迴圈控制語句:
- break 語句 經常用於中斷當前 for 迴圈或跳出 switch 語句
package mainimport "fmt"func main() { /* 定義局部變數 */ var a int = 10 /* for 迴圈 */ for a < 20 { fmt.Printf("a 的值為 : %d\n", a) a++ if a > 15 { /* 使用 break 語句跳出迴圈 */ break } }}
- continue 語句 跳過當前迴圈的剩餘語句,然後繼續進行下一輪迴圈。
package mainimport "fmt"func main() { /* 定義局部變數 */ var a int = 10 /* for 迴圈 */ for a < 20 { if a == 15 { /* 跳過此次迴圈 */ a = a + 1 continue } fmt.Printf("a 的值為 : %d\n", a) a++ }}
可以看到,15沒有被打出來。
- goto 語句 將控制轉移到被標記的語句。也稱成為跳躍陳述式。
但是,在結構化程式設計中一般不主張使用goto語句, 以免造成程式流程的混亂,使理解和偵錯工具都產生困難。
package mainimport "fmt"func main() { /* 定義局部變數 */ var a int = 10 /* 迴圈 */LOOP: for a < 20 { if a == 15 { /* 跳過迭代 */ a = a + 1 goto LOOP } fmt.Printf("a的值為 : %d\n", a) a++ }}