Go快速入門 03 | 控制結構:if、for、switch 邏輯語句

Swenson1992發表於2021-02-04

流程控制語句用於控制程式的執行順序,這樣程式就具備了邏輯結構。一般流程控制語句需要和各種條件結合使用,比如用於條件判斷的 if,用於選擇的 switch,用於迴圈的 for 等。

if 條件語句

if 語句是條件語句,它根據布林值的表示式來決定選擇哪個分支執行:如果表示式的值為 true,則 if 分支被執行;如果表示式的值為 false,則 else 分支被執行。下面看一個 if 條件語句示例:

func main() {
    i:=10
    if i >10 {
        fmt.Println("i>10")
    } else {
        fmt.Println("i<=10")
    }
}

這是一個非常簡單的 if……else 條件語句,當 i>10 為 true 的時候,if 分支被執行,否則就執行 else 分支,執行這段程式碼,驗證列印結果。

關於 if 條件語句的使用有一些規則:

  • if 後面的條件表示式不需要使用 (),這和有些程式語言不一樣,也更體現 Go 語言的簡潔;
  • 每個條件分支(if 或者 else)中的大括號是必須的,哪怕大括號裡只有一行程式碼(如示例);
  • if 緊跟的大括號 { 不能獨佔一行,else 前的大括號 } 也不能獨佔一行,否則會編譯不通過;
  • 在 if……else 條件語句中還可以增加多個 else if,增加更多的條件分支。

通過 go run main.go 執行下面的這段程式碼,會看到輸出了 5<i<=10 ,這說明程式碼中的 else if i>5 && i<=10 成立,該分支被執行。

func main() {
    i:=6
    if i >10 {
        fmt.Println("i>10")
    } else if  i>5 && i<=10 {
        fmt.Println("5<i<=10")
    } else {
        fmt.Println("i<=5")
    }
}

通過修改 i 的初始值,來驗證其他分支的執行情況。

還可以增加更多的 else if,以增加更多的條件分支,不過這種方式不被推薦,因為程式碼可讀性差,多個條件分支可以使用 switch 代替,使程式碼更簡潔。

和其他程式語言不同,在 Go 語言的 if 語句中,可以有一個簡單的表示式語句,並將該語句和條件語句使用分號 ; 分開。同樣是以上的示例,使用這種方式對其改造,如下面程式碼所示:

func main() {
    if i:=6; i >10 {
        fmt.Println("i>10")
    } else if  i>5 && i<=10 {
        fmt.Println("5<i<=10")
    } else {
        fmt.Println("i<=5")
    }
}

在 if 關鍵字之後,i>10 條件語句之前,通過分號 ; 分隔被初始化的 i:=6。這個簡單語句主要用來在 if 條件判斷之前做一些初始化工作,可以發現輸出結果是一樣的。

通過 if 簡單語句宣告的變數,只能在整個 if……else if……else 條件語句中使用,比如以上示例中的變數 i。

switch 選擇語句

if 條件語句比較適合分支較少的情況,如果有很多分支的話,選擇 switch 會更方便,比如以上示例,使用 switch 改造後的程式碼如下:

switch i:=6;{
case i>10:
    fmt.Println("i>10")
case i>5 && i<=10:
    fmt.Println("5<i<=10")
default:
    fmt.Println("i<=5")
}

switch 語句同樣也可以用一個簡單的語句來做初始化,同樣也是用分號 ; 分隔。每一個 case 就是一個分支,分支條件為 true 該分支才會執行,而且 case 分支後的條件表示式也不用小括號 () 包裹。

在 Go 語言中,switch 的 case 從上到下逐一進行判斷,一旦滿足條件,立即執行對應的分支並返回,其餘分支不再做判斷。也就是說 Go 語言的 switch 在預設情況下,case 最後自帶 break。這和其他程式語言不一樣,比如 C 語言在 case 分支裡必須要有明確的 break 才能退出一個 case。Go 語言的這種設計就是為了防止忘記寫 break 時,下一個 case 被執行。

那麼如果真的有需要,的確需要執行下一個緊跟的 case 怎麼辦呢?Go 語言也考慮到了,提供了 fallthrough 關鍵字。現在看個例子,如下面的程式碼所示:

switch j:=1;j {
case 1:
    fallthrough
case 2:
    fmt.Println("1")
default:
    fmt.Println("沒有匹配")
}

以上示例執行會輸出 1,如果省略 case 1: 後面的 fallthrough,則不會有任何輸出。

不知道是否可以發現,和上一個例子對比,這個例子的 switch 後面是有表示式的,也就是輸入了 ;j,而上一個例子的 switch 後只有一個用於初始化的簡單語句。

當 switch 之後有表示式時,case 後的值就要和這個表示式的結果型別相同,比如這裡的 j 是 int 型別,那麼 case 後就只能使用 int 型別,如示例中的 case 1、case 2。如果是其他型別,比如使用 case “a” ,會提示型別不匹配,無法編譯通過。

而對於 switch 後省略表示式的情況,整個 switch 結構就和 if……else 條件語句等同了。

switch 後的表示式也沒有太多限制,是一個合法的表示式即可,也不用一定要求是常量或者整數。可以像如下程式碼一樣,直接把比較表示式放在 switch 之後:

switch 2>1 {
case true:
    fmt.Println("2>1")
case false:
    fmt.Println("2<=1")
}

可見 Go 語言的 switch 語句非常強大且靈活。

for 迴圈語句

當需要計算 1 到 100 的數字之和時,如果用程式碼將一個個數字加起來,會非常複雜,可讀性也不好,這就體現出迴圈語句的存在價值了。

下面是一個經典的 for 迴圈示例,從這個示例中,可以分析出 for 迴圈由三部分組成,其中,需要使用兩個 ; 分隔,如下所示:

sum:=0
for i:=1;i<=100;i++ {
    sum+=i
}
fmt.Println("the sum is",sum)

其中:

  • 第一部分是一個簡單語句,一般用於 for 迴圈的初始化,比如這裡宣告瞭一個變數,並對 i:=1 初始化;
  • 第二部分是 for 迴圈的條件,也就是說,它表示 for 迴圈什麼時候結束。這裡的條件是 i<=100;
  • 第三部分是更新語句,一般用於更新迴圈的變數,比如這裡 i++,這樣才能達到遞增迴圈的目的。

需要特別留意的是,Go 語言裡的 for 迴圈非常強大,以上介紹的三部分組成都不是必須的,可以被省略。

如果以前學過其他程式語言,可能會見到 while 這樣的迴圈語句,在 Go 語言中沒有 while 迴圈,但是可以通過 for 達到 while 的效果,如以下程式碼所示:

sum:=0
i:=1
for i<=100 {
    sum+=i
    i++
}
fmt.Println("the sum is",sum)

這個示例和上面的 for 示例的效果是一樣的,但是這裡的 for 後只有 i<=100 這一個條件語句,也就是說,它達到了 while 的效果。

在 Go 語言中,同樣支援使用 continue、break 控制 for 迴圈:

  • continue 可以跳出本次迴圈,繼續執行下一個迴圈。
  • break 可以跳出整個 for 迴圈,哪怕 for 迴圈沒有執行完,也會強制終止。

現在對上面計算 100 以內整數和的示例再進行修改,演示 break 的用法,如以下程式碼:

sum:=0
i:=1
for {
    sum+=i
    i++
    if i>100 {
        break
    }
}
fmt.Println("the sum is",sum)

這個示例使用的是沒有任何條件的 for 迴圈,也稱為 for 無限迴圈。此外,使用 break 退出無限迴圈,條件是 i>100。

總結

if、for 和 switch 這樣的控制語句的基本用法,使用它們,可以更好地控制程式的邏輯結構,達到業務需求的目的。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
?

相關文章