1. 程式人生 > >Go語言學習筆記(四) 流程控制

Go語言學習筆記(四) 流程控制

程式設計語言的流程控制語句,用於設定計算執行的次序,建立程式的邏輯結構。可以說,流程控制語句是整個程式的骨架。從根本上講,流程控制只是為了控制程式語句的執行順序,一般需要與各種條件配合,因此,在各種流程中,會加入條件判斷語句。流程控制語句一般起以下3個作用:

 

  • 選擇,即根據條件跳轉到不同的執行序列;
  • 迴圈,即根據條件反覆執行某個序列,當然每一次迴圈執行的輸入輸出可能會發生變化;
  • 跳轉,即根據條件返回到某執行序列。

Go語言支援如下的幾種流程控制語句:

 

  • 條件語句,對應的關鍵字為if、else和else if;
  • 選擇語句,對應的關鍵字為switch、case和select(將在介紹channel的時候細說);
  • 迴圈語句,對應的關鍵字為for和range;
  • 跳轉語句,對應的關鍵字為goto。

在具體的應用場景中,為了滿足更豐富的控制需求,Go語言還添加了如下關鍵字:break、continue和fallthrough。在實際的使用中,需要根據具體的邏輯目標、程式執行的時間和空間限制、程式碼的可讀性、編譯器的程式碼優化設定等多種因素,靈活組合。

條件語句

 

選擇語句

根據傳入條件的不同,選擇語句會執行不同的語句。下面的例子根據傳入的整型變數i的不同而列印不同的內容:

switch i {
case 0:
fmt.Printf("0")
case 1:
fmt.Printf("1")
case 2:
fallthrough//不退出switch而繼續執行
case 3:
fmt.Printf("3")
case 4, 5, 6:
fmt.Printf("4, 5, 6")
default:
fmt.Printf("Default")
}
執行上面的案例,將會得到如下結果:
 i = 0時,輸出0;
 i = 1時,輸出1;
 i = 2時,輸出3;
 i = 3時,輸出3;
 i = 4時,輸出4, 5, 6;
 i = 5時,輸出4, 5, 6;
 i = 6時,輸出4, 5, 6;
 i = 其他任意值時,輸出Default。

switch後面的表示式甚至不是必需的,比如下面的例子:

switch {
case 0 <= Num && Num <= 3:
fmt.Printf("0-3")
case 4 <= Num && Num <= 6:
fmt.Printf("4-6")
case 7 <= Num && Num <= 9:
fmt.Printf("7-9")
}

在使用switch結構時,我們需要注意以下幾點:

  •  左花括號{必須與switch處於同一行;
  •  條件表示式不限制為常量或者整數;
  •  單個case中,可以出現多個結果選項;
  •  與C語言等規則相反,Go語言不需要用break來明確退出一個case;
  •  只有在case中明確新增fallthrough關鍵字,才會繼續執行緊跟的下一個case;
  •  可以不設定switch之後的條件表示式,在此種情況下,整個switch結構與多個if...else...的邏輯作用等同。

迴圈語句

與多數語言不同的是,Go語言中的迴圈語句只支援for關鍵字,而不支援while和do-while結構。

sum := 0
for i := 0; i < 10; i++ {
sum += i
}

無限迴圈,替代while

for {
sum++
if sum > 100 {
break
}
}

在條件表示式中也支援多重賦值,如下所示:

a := []int{1, 2, 3, 4, 5, 6}
for i, j := 0, len(a) – 1; i < j; i, j = i + 1, j – 1 {
a[i], a[j] = a[j], a[i]
}

使用迴圈語句時,需要注意的有以下幾點。

  •  左花括號{必須與for處於同一行。
  •  Go語言中的for迴圈與C語言一樣,都允許在迴圈條件中定義和初始化變數,唯一的區別是,Go語言不支援以逗號為間隔的多個賦值語句,必須使用平行賦值的方式來初始化多個變數。
  •  Go語言的for迴圈同樣支援continue和break來控制迴圈,但是它提供了一個更高階的break,可以選擇中斷哪一個迴圈,如下例:
for j := 0; j < 5; j++ {
for i := 0; i < 10; i++ {
if i > 5 {
break JLoop  //break語句終止的是JLoop標籤處的外層迴圈
}
fmt.Println(i)
}
}
JLoop:
// ...

跳轉語句

goto還是會在一些場合下被證明是最合適的,如:

func myfunc() {
i := 0
HERE:
fmt.Println(i)
i++
if i < 10 {
goto HERE
}
}