天天看點

Go語言學習(五)流程控制語句

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
    }
}