在Go語言中,總結後的流程控制語句主要有if
、for
、switch
、goto
。其中常用的爲if
、for
。
接下來講依次記錄這幾種流程控制,並以程式碼進行說明。
if條件語句的一般格式如範例所示:
/*
當第一個表達式爲true時,執行第一個邏輯塊,否則判斷第二個表達式;第二個表達式爲true時執行第二個邏輯塊,
否則執行第三個邏輯塊。
*/
if 表達式 {
邏輯塊
} else if 表達式 {
邏輯塊
} else {
邏輯塊
}
注意:在Go中關於if
有個硬性規定,與if
匹配的{
必須和if與表達式
在同一行,{
放在其他位置在編譯的時候會報錯;與else
匹配的{
也必須寫在同一行,並且else
與它對應的if
的}
也要在同一行。
範例:
func ifDemo() {
age := 25
if age >= 65 {
fmt.Println("美滋滋地退休生活...")
} else if age <= 18 {
fmt.Println("美滋滋的地學生生活...")
} else {
fmt.Println("苦逼的上班社畜0.0")
}
}
此外,if語句還可以在表達式之前寫一個執行語句,用;
隔開,之後再根據條件進行判斷真假
範例:
func ifDemo() {
if age := 25; age >= 65 {
fmt.Println("美滋滋地退休生活...")
} else if age <= 18 {
fmt.Println("美滋滋的地學生生活...")
} else {
fmt.Println("苦逼的上班社畜0.0")
}
}
這種在if
後面定義的變數,其作用域爲整個if
流程,出了if
流程之後age
變數便失去了作用。
在Go中的控制回圈實現用for
。
如下範例:
for 初始語句;條件語句;結束語句 {
回圈塊語句
}
條件語句返回
true
時回圈會一直進行下去,回圈塊會一直執行,直到條件語句返回false
時退出回圈
變種1:在Go中for
回圈的初始語句
可以忽略
範例:
func forDemo() {
i := 0
for ; i < 9; ++i {
fmt.Printf("%d ",i)
}
}
變種2:在Go中for
回圈的初始語句
和結束語句
都可以忽略
範例:
func forDemo() {
i := 0
for ; i < 9; {
fmt.Printf("%d ",i)
i++
}
}
死回圈:可以通過break
、goto
、return
、panic
強制退出回圈來結束死回圈
在Go中可以通過使用for range
來遍歷陣列、切片、字串、map等。其中,在遍歷陣列、切片和字串的時候,其遍歷返回索引和值;在遍歷map時返回鍵、值;在遍歷channel時只返回通道值。
通過使用switch
+case
來對大量的if
語句進行簡化程式碼,範例:
func switchDemo() {
age := 25
switch { //case使用表達式的時候在switch後不寫變數
case age < 12:
fmt.Println("童年")
case age < 18:
fmt.Println("少年")
case age < 30:
fmt.Println("青年")
case age < 60:
fmt.Println("中年")
default: //default在一個switch中只能有一個
fmt.Println("老年")
}
}
注意:在Go中,匹配到case
後執行對應的語句塊後會直接跳出switch
語句,不必寫break
來跳出switch
流程。
變種1 :case
後可跟數位、字母,且switch
與case
的數據型別必須相同
範例:
func switchDemo() {
age := 2
switch age { //age與1、2、3、4都是相同的數據型別
case 1:
fmt.Println(1)
case 2:
fmt.Println(2)
case 3:
fmt.Println(3)
case 4:
fmt.Println(4)
default:
fmt.Println(5)
}
}
變種2 :通過使用fallthrough
來執行滿足case
條件的下一個case
,範例:
func switchDemo() {
age := 25
switch {
case age < 12:
fmt.Println("童年")
case age < 18:
fmt.Println("少年")
case age < 30:
fmt.Println("青年")
fallthrough
case age < 60:
fmt.Println("中年")
default:
fmt.Println("老年")
}
}
會列印出"青年"跟"中年"兩個字串
goto
語句通過標籤在程式碼間的進行無條件跳轉。比較有效的用於多層回圈退出時,範例:
//雙回圈不使用goto時需要設定一個退出標籤來跳出回圈,多層時需要更多的標籤
func gotoDemo1() {
var breakFlag bool
for i := 0; i < 10; i++ {
for j := 0; j < 10; j++ {
if j == 2 {
// 設定退出標籤
breakFlag = true
break
}
fmt.Printf("%v-%v\n", i, j)
}
// 外層for回圈判斷
if breakFlag {
break
}
}
}
//使用goto直接跳出雙回圈
func gotoDemo2() {
for i := 0; i < 10; i++ {
for j := 0; j < 10; j++ {
if j == 2 {
// 設定退出標籤
goto breakTag
}
fmt.Printf("%v-%v\n", i, j)
}
}
return
// 標籤
breakTag:
fmt.Println("結束for回圈")
}
break
語句可以結束for
、switch
、select
的程式碼塊。範例:
//break語句還可以在語句後面新增標籤,表示退出某個標籤對應的程式碼塊
func breakDeme() {
//要求標籤必須在對應的語句的程式碼塊上
breakDemo:
for i:= 0; i < 10; i++ {
if i == 8 {
break breakDeme
}
fmt.Println(i)
}
fmt.Println("Demo is over...")
}
continue
語句可以結束當前回圈,開始下一次的回圈迭代過程,僅限在for
回圈內使用。
func breakDeme() {
//在 continue語句後新增標籤時,表示開始標籤對應的回圈。
continueDemo:
for i:= 0; i < 10; i++ {
if i == 8 {
continue continueDemo
}
fmt.Println(i)
}
fmt.Println("Demo is over...")
}