Go流程控制代碼詳解
Go流程控制
1、條件語句IF
1、簡單格式(不支持三目運(yùn)算符) if 布爾表達(dá)式 { // 執(zhí)行語句 } 2、if里面包含多個表達(dá)式的時候,使用‘;'隔開
2、條件語句switch
1、var1可以是任何類型,value1和value2可以是同類型的人和值 switch var1 { case value1: xxx case value2: xxx default: yyy }
1、Type Switch
? switch還可以被用于type-switch來判斷某個interface變量中實際存儲的變量類型
switch x.(type) { case type: statement(s) case type: statement(s) default: statement(s) }
3、條件語句select
? select語句類似switch語句,但select會隨機(jī)執(zhí)行一個可運(yùn)行的case,如果沒有case可運(yùn)行,它將阻塞,直到有case可運(yùn)行。
select { case communication clause : statement(s) case communication clause : statement(s) default: statement(s) } // 解釋:每個case必須是一個通信,所有的channel表達(dá)式都會被求值,所有被發(fā)送的表達(dá)式都會被求值, // 1、如果任意某個通信可以執(zhí)行,就執(zhí)行,其余忽略 // 2、如果有多個case可以執(zhí)行,select隨機(jī)且公平的選出一個執(zhí)行 // 3、否則:如果有default語句,執(zhí)行;沒有default,select將阻塞,直到某個通信可以運(yùn)行,Go不會重新對Channel或值進(jìn)行求職
1、golang select的使用以及典型用法
1、基本使用:
用于處理異步IO操作,select會監(jiān)聽case語句中的channel的讀寫操作,當(dāng)case中channel讀寫操作為非阻塞狀態(tài),將觸發(fā)相應(yīng)的動作。(case語句必須是channel操作)
2、典型用法:
1)超時判斷
//比如在下面的場景中,使用全局resChan來接受response,如果時間超過3S,resChan中還沒有數(shù)據(jù)返回,則第二條case將執(zhí)行 var resChan = make(chan int) // do request func test() { select { case data := <-resChan: doData(data) case <-time.After(time.Second * 3): fmt.Println("request time out") } } func doData(data int) { //... }
2)退出
//主線程(協(xié)程)中如下: var shouldQuit=make(chan struct{}) fun main(){ { //loop } //...out of the loop select { case <-c.shouldQuit: cleanUp() return default: } //... } //再另外一個協(xié)程中,如果運(yùn)行遇到非法操作或不可處理的錯誤,就向shouldQuit發(fā)送數(shù)據(jù)通知程序停止運(yùn)行 close(shouldQuit)
3)判斷channel是否阻塞
//在某些情況下是存在不希望channel緩存滿了的需求的,可以用如下方法判斷 ch := make (chan int, 5) //... data:=0 select { case ch <- data: default: //做相應(yīng)操作,比如丟棄data。視需求而定 }
4、循環(huán)語句for
for init; condition; post {} for condition {} for {} // 解釋:1)init一般為賦值表達(dá)式,給控制變量賦初始值;2)condition:關(guān)系表達(dá)式或邏輯表達(dá)式,循環(huán)控制條件;3)post:一般為賦值表達(dá)式,給控制變量增量或減量 // 執(zhí)行流程:判別賦值表達(dá)式init是否滿足condition給定的條件,若為真,則執(zhí)行循環(huán)語句,然后執(zhí)行post,進(jìn)入第二輪循環(huán)
5、循環(huán)語句range
for key, value := range oldMap { newMap[key] = value }
for 和 for range 有什么區(qū)別?
1、使用場景:
? 1)for可以遍歷array、slice、key為整形遞增的map、string
? 2)for range 可以完成for所有事情,卻能做for不能做的事情,包括遍歷key為string類型的map、遍歷channel
6、循環(huán)控制goto、break、…
Goto、Break、Continue 1、三個語句都可以配合標(biāo)簽(label)使用 2、標(biāo)簽名區(qū)分大小寫,定義后若不是用會造成編譯錯誤 3、continue、break配合標(biāo)簽(label)可以用于多層循環(huán)跳出 4、goto調(diào)整執(zhí)行位置,與continue、break配合標(biāo)簽(label)的結(jié)果并不相同
以上就是Go流程控制代碼詳解的詳細(xì)內(nèi)容,更多關(guān)于Go流程控制的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Go prometheus metrics條目自動回收與清理方法
這篇文章主要為大家介紹了Go prometheus metrics條目自動回收與清理方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11構(gòu)建Golang應(yīng)用最小Docker鏡像的實現(xiàn)
這篇文章主要介紹了構(gòu)建Golang應(yīng)用最小Docker鏡像的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05