Go基礎系列 流程控制結構

2021-09-07 20:20:46 字數 4916 閱讀 6461

條件判斷結構:if else

分支選擇結構:switch case

迴圈結構:for

break:退出for或switch結構(以及select)

continue:進入下一次for迭代

雖然go是類c的語言,但go在這些流程控制語句中的條件表示式部分不使用括號。甚至有些時候使用括號會報錯,但有些複雜的條件判斷需要使用括號改變優先順序。

如:

if (name == "longshuai" && age > 23) || (name == "xiaofang" && age < 22)
if condition1  else if condition2  else
注意,go對語法要求很嚴格。左大括號必須換行,如果有else或else if,則必須緊跟這兩個關鍵字。也就是說,上面的**結構中,大括號的使用位置是強制規範的,不能隨意換行放置。

在go中,if語句的condition前面可以加上初始化語句,例如go中很常見的:

if val := 10; val > max
它在一定程度上等價於:

val := 10

if val > max

但注意,前面簡寫的方式中,val的作用域只在if範圍內,if外面無法訪問這個val。如果在if語句之前已經定義了乙個val,那麼這個val將被if中的val掩蓋,直到if退出後才恢復。

func main() 

println(val) // 輸出20

}

一種解決方式是if中的初始化語句不要使用:=,而是直接使用=,但這樣會修改原始的值。

func main() 

println(val) // 輸出10

}

在go中,經常使用兩個(或多個)返回值的函式,乙個返回值作為值,另乙個作為布林型別的判斷值,或者作為錯誤資訊。通常會使用if語句去檢測多個返回值的函式是否成功。

但注意,一般有兩種判斷返回值:一種是ok型別,一種是err型別的錯誤資訊。前者是布林值,後者是表明錯誤資訊的字串,如果沒錯誤,則err為nil。

value,ok := func_name()

if !ok

value,err := func_name()

if err != nil

將上面的簡寫一下,得到更常見的判斷方式:

if value,ok := func_name();ok  else 

if value,err := func_name();err != nil else

switch語句用於提供分支測試。有兩種swithc結構:expression switch和type switch,本文暫時只介紹expression switch,它用於判斷表示式是否為true。

對於expression switch,也有三種形式:等值比較、表示式比較、初始化表示式。

等值比較結構:當var1的值為val1時,執行statement1,當var1的值為val2時,執行statement2,都不滿足時,執行預設的語句statement。

switch var1
等值比較侷限性很大,只能將var1和case中的值比較是否相等。如果想比較不等,或者其它表示式型別,可以使用下面的表示式比較結構。

表示式比較結構:評估每個case結構中的condition,只要評估為真就執行,然後退出(預設情況下)。

switch
初始化表示式:可以和if一樣為switch加上初始化表示式,同樣作用域只在switch可見。但注意,initialization後面記得加上分號";"結尾。見下文示例。

switch initialization;
default是可選的,且可以寫在switch的任何位置。

如果case中有多個要執行的語句,可以加大括號,也可以不加大括號。當只有乙個語句的時候,statement可以和case在同一行。

case中可以提供多個用於測試的值,使用逗號分隔,只要有乙個符合,就滿足條件:

switch var1
例如:

val := 20

switch val

即使是表示式比較結構,也一樣可以使用逗號分隔多個表示式,這時和使用邏輯或"||"是等價的:

func main() 

}

預設情況下case命中就結束,所以所有的case中只有乙個會被執行。但如果想要執行多個,可以在執行完的某個case的最後乙個語句上加上fallthrough,它會無條件地直接跳轉到下一條case並執行,如果下一條case中還有fallthrough,則相同的邏輯。此外,fallthrough的後面必須只能是下乙個case或default,不能是額外的任何語句,否則會報錯。

例如:

func main() 

}

執行結果為:

1 2

3end

fallthrough一般用於跳過某個case。例如:

swtich i
它表示等於0或等於1的時候都執行statement1。這和前面case中多個評估值的功能是一樣的。

以下是乙個初始化表示式結構的switch示例:

func main() 

println(val) // 輸出21

}

go中只有一種迴圈結構:for。

// 完整格式的for

for init; condition; modif

// 只有條件判斷的for,實現while的功能

// 要在迴圈體中加上退出條件,否則無限迴圈

for condition

例如:

// 完整格式

func main()

}// 只有條件的格式

func main()

}

好幾種方式實現for的無限迴圈。只要省略for的條件判斷部分就可以實現無限迴圈。

for i := 0;;i++ 

for

for ;;

for true

無限迴圈時,一般在迴圈體中加上退出語句,如break、os.exit、return等。

range關鍵字非常好用,可以用來迭代那些可迭代的物件。比如slice、map、array,還可以迭代字串,甚至是unicode的字串。

for index,value := range *** {}
但千萬注意,value是從***中拷貝的副本,所以通過value去修改***中的值是無效的,在迴圈體中應該總是讓value作為乙個唯讀變數。如果想要修改***中的值,應該通過index索引到源值去修改(不同型別修改的方式不一樣)。

以迭代字串為例。

func main() 

}

輸出結果:

0 x

1 i2 a

3 o4 f

5 a6 n

7 g8 ,

9 你12 好

可見,在迭代字串的時候,是按照字元而非位元組進行索引的。

下面通過value去修改slice將無效。

func main() 

for index,value := range s1

fmt.println(s1) // for外面的結果仍然是[11 22 33]

}

要在迴圈結構中修改slice,應該通過index索引的方式:

func main() 

for index,value := range s1

fmt.println(s1) // [12 23 34]

}

breake用於退出當前整個迴圈。如果是巢狀的迴圈,則退出它所在的那一層迴圈。break除了可以用在for迴圈中,還可以用在switch結構或select結構。

continue用於退出當前迭代,進入下一輪迭代。continue只能用於for迴圈中。

當某一行中第乙個單詞後面跟乙個冒號的時候,go就認為這是乙個標籤。例如:

func main() 

fmt.printf("i is: %d, and j is: %d\n", i, j)}}

}

使用標籤能讓break、continue以及goto跳轉到指定的位置繼續往下執行。例如這裡的continue label1,當j == 4的時候,就直接跳到外層迴圈進入下一輪迭代。而break label則指定直接退出label所在的那一層迴圈。

goto懶得介紹了,反正沒人用,也強烈不建議使用,甚至標籤都建議不要使用。一般能使用label或goto的結構,都能改寫成其它更好的語句。

go中支援空block{},這個大括號有自己的作用域,裡面的**只執行一次,退出大括號就退出作用域。

func main() 

fmt.println(v) // 輸出1

}}

go基礎4 流程控制

所有語言的流程控制都是三個 順序執行 if else for 一 if else 分支結構 if 表示式1else if 表示式2 else func ifdemo1 score 65 if score 90 fmt.println a 1,2 if 條件特殊寫法 在 if表示式之前加乙個執行語句 ...

go流程控制

用於測試條件是否成立,成立則執行if括起來的 if condition 複製 如果需要在條件不滿足時執行,則只需要加上else即可 if condition else 複製 如果存在多個條件,可以使用else if增加新的判斷 if condition1 else if condition2 els...

go流程控制

1 if語句 1 if ture else 2if a 44 a 23else 2 switchswitch 語句用於基於不同條件執行不同動作,每乙個 case 分支都是唯一的,從上直下逐一測試,直到匹配為止。golang switch 分支表示式可以是任意型別,不限於常量。可省略 break,預設...