Go語言支援如下的幾種流程控制語句:
條件語句,對應的關鍵字為if,else和else if;
選擇語句,對應的關鍵字為switch , case 和select(将在介紹channel的時候細說);
循環語句,對應的關鍵字為for和range;
跳轉語句,對應的關鍵字為goto
在具體的應用場景中,為了滿足更豐富的控制需求,Go語言還添加了如下關鍵字:break,continue和fallthrough.
1.1條件語句,需要注意以下幾點:
a.條件語句不需要使用括号将條件包括起來();
b.無論語句體内有幾條語句,花括号{}都是必須存在的;
c左花括号{必須與if或者else處于同一行;
d在if之後,條件語句之前可以添加變量初始化語句,例如使用: 間隔;
e在有傳回值的函數中,不允許将"最終的" return語句包含在if...else...結構中,否則會編譯失敗:"function ends without a return statement"
1.2選擇語句
在使用switch結構時,我們需要注意以下幾點:
a.左花括号{必須與switch處于同一行;
b條件表達式不限制為常量或者整數;
c.單個case中,可以出現多個結果選項;
d.與c.java等語言規則相反,Go語言不需要用break來明确退出一個case;
e.隻有在case中明确添加fallthrough關鍵字,才會繼續執行緊跟的下一個case;
f.可以不設定swith之後的條件表達式,在此種情況下,整個switch結構與多個if...else...的邏輯作用等同。
根據傳入條件的不同,選擇語句會執行不同的語句。下面的例子根據傳入的整形變量i的不同而列印不同的内容;
switch i {
case 0:
fmt.Printf("0")
case 1:
fmt.Printf("1")
case 2:
fallthrough
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
比較有意思的是,swith後面的表達式甚至不是必需的,比如下面的例子;
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")
}
1.3循環語句
與多數語句不同的是,Go語言中的循環語句隻支援for關鍵字,而不支援while和do-while結構。
sum := 0
for i :=0;i<10;i++{
sum +=i
}
可以看到比較大的一個不同在于 for 後面的條件表達式不需要用圓括号 () 包含起來。Go語言還可進一步考慮到無線循環的場景,讓開發者不用寫無聊的for(::){}和do{}
while(1);,而直接簡化為如下的寫法;
sum := 0
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]
}
在使用循環語句時,需要注意的有以下幾點。
a.左花括号 { 必須與for處于同一行。
b.Go語言中的for循環與c語言一樣,都允許在循環條件中定義和初始化變量,唯一的差別是,Go語言不支援以逗号為間隔的多個指派語句,必須使用平行指派的方式來初始化多個變量。
c.Go語言的for循環同樣支援continue和break來控制循環,但是他提供了一個更進階的break,可以使用中斷哪一個循環,如下例
for j := 0;j<5;j++{
for i :=0 ;i<10;i++{
if i>5 {
break Tag
}
fmt.Println(i)
}
}
Tag:
上面例子中的break tag是用來終止Tag标簽處的外層循環的。
for循環還可以結合range關鍵字來使用,例如:
for k,v := range [array,slice,map]{ //range可周遊array,slice,map
fmt.Println("key=",k," value=",v)
}
1.4跳轉語句
goto 語句的語義非常簡單,就是跳轉到本函數内的某個标簽,如:
func myfunc() {
i :=
HERE:
fmt.Println(i)
i++
if i < {
goto HERE
}
}