Golang通脈之流程控制詳情

2022-09-24 23:18:12 字數 2816 閱讀 4713

目錄

前言:流程控制是每種程式語言控制邏輯走向和執行次序的重要部分,流程控制可以說是一門語言的「經脈」。

go語言中最常用的流程控制有if和for,而switch和goto主要是為了簡化**、降低重複**而生的結構,屬於擴充套件類的流程控制。

go語言中if條件判斷的格式如下:

if 表示式1 else if 表示式2 else

當表示式1的結果為true時,執行分支1,否則判斷表示式2,如果滿足則執行分支2,都不滿足時,則執行分支3。 if判斷中的else if和elsuqpynmlaqe都是可選的,可以根據實際需要進行選擇。

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

if條件判斷還有一種特殊的寫法,可以在if表示式之前新增乙個執行語句,再根據變數值進行判斷:

func main() else if i>5 && i<=10

條件表示式返回true時迴圈體不停地進行迴圈,直到條件表示式返回false時自動退出迴圈。

func fordemo()

}for迴圈的初始語句可以被忽略,但是初始語句後的分號必須要寫,例如:

func fordemo2()

}for迴圈的初始語句和結束語句都可以省略,例如:

func fordemo3()

}這種寫法類似於其他程式語言中的while,在while後新增乙個條件表示式,滿足條件表示式時持續迴圈,否則結束迴圈。

for

for迴圈可以通過break、goto、return、panic語句強制退出迴圈。

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

continue可以跳出本次迴圈,繼續執行下乙個迴圈。

break可以跳出整個for 迴圈,哪怕 for 迴圈沒有執行完,也會強制終止。

go語言中可以使用for range遍歷陣列、切片、字串、map及通道(channel)。

通過for range遍歷的返回值有以下規律:

注意:與 for 不同的是,range 對每個迭代值都建立了乙個拷貝。因此如果每次迭代的值記憶體占用很小的情況下,for 和 range 的效能幾乎沒有差異,但是如果每個迭代值記憶體占用很大,這種情況下差距就非常明顯了。

簡單的例子證明 range 迭代時,返回的是拷貝。

persons := struct, , }

for _, s := range persons

for i := 0; i < len(persons); i++

fmt.println(persons) // [ ]

range在迭代過程中返回的是迭代值的拷貝,如果每次迭代的元素的記憶體占用很低,那麼 for 和range的效能幾乎是一樣,例如 int。但是如果迭代的元素記憶體占用較高,例如乙個包含很多屬性的struct結構體,那麼for的效能將顯著地高於range,有時候甚至會有上千倍的效能差異。對於這種場景,建議使用 for,如果使用range,建議只迭代下標,通過下標訪問迭代值,這種使用方式和 for 就沒有區別了。如果想使用range同時迭代下標和值,則需要將切片/陣列的元素改為指標,才能不影響效能。

使用switch語句可方便地對大量的值進行條件判斷。

func switchdemo1()

}go語言規定每個switch只能有乙個default分支。

乙個分支可以有多個值,多個case值中間使用英文逗號分隔。

func testswitch3()

}分支還可以使用表示式,這時候switch語句後面不需要再跟判斷變數:

func switchdemo4()

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

fallthrough語法可以執行滿足條件的case的下乙個case,是為了相容c語言中的case設計的。

func switchdemo5()

}輸出:ab

goto語句通過標籤進行**間的無條件跳轉。goto語句可以在快速跳出迴圈、避免重複退出上有一定的幫助。go語言中使用goto語句能簡化一些**的實現過程。

例如雙層巢狀的for迴圈要退出時:

func gotodemo1()

fmt.printf("%v-%v\n", i, j)

} // 外層for迴圈判斷

if breakflag

}}使用goto語句能簡化**:

func gotodemo2()

fmt.printf("%v-%v\n", i, j)

} }return

// 標籤

breaktag:

fmt.println("結束for迴圈")

}break語句可以結束for、switch和select的**塊。

break語句還可以在語句後面新增標籤,表示退出某個標籤對應的**塊,標籤要求必須定義在對應的for、switch和select的**塊上。舉個例子:

func breakdemo1()

fmt.printf("%v-%v\n", i, j)

} }fmt.println("...")

}continue語句可以結束當前迴圈,開始下一次的迴圈迭代過程,僅限在for迴圈內使用。

在continue語句後新增標籤時,表示開始標籤對應的迴圈。例如:

func continuedemo()

fmt.printf("%v-%v\n", i, j)

} }}

Golang 基礎之流程控制

ps 參考博文,致謝 if 表示式1 else if 表示式2 else if 條件判斷 func main else if age 20 else if age 10 else func ifdemo2 else if score 75 else 作用域,此時score變數只在if條件語句內部生效...

Golang通脈之map詳情

目錄 go語言中提供的對映關係容器為map,其內部使用雜湊表 hash 實現。map是一種無序的鍵值對的集合。map 最重要的一點是通過 key 來快速檢索資料,key類似於索引,指向資料的值 map 是一種集合,所以可以像迭代陣列和切片那樣迭代它。不過,map 是無序的,無法決定它的返回順序,這是...

golang之流程控制(注意點)

package main import fmt outerfunc是外圍函式 defer執行順序是,先進後出,延遲呼叫指定的函式 當外圍函式中語句執行完畢時,只有延遲函式都執行完畢,外圍函式才真的結束 當執行外媒函式中的return時,只有延遲函式都執行完畢,外圍函式才返回 當外圍函式中的 引發執行...