Golang流程控制語(yǔ)句的具體使用
順序控制
順序控制
默認(rèn)情況下,Go代碼執(zhí)行順序是按照從上到下依次執(zhí)行的,這種按照順序執(zhí)行的代碼就叫做順序語(yǔ)句。如下:
package main import "fmt" func main() { // 順序控制 fmt.Println("statement 1...") fmt.Println("statement 2...") fmt.Println("statement 3...") }
分支控制
if語(yǔ)句
if語(yǔ)句
Go中if語(yǔ)句的基本語(yǔ)法如下:
使用案例如下:
package main import "fmt" func main() { // if語(yǔ)句 var num1, num2 int = 10, 20 if num1 > num2 { fmt.Println("num1 > num2") } else if num1 < num2 { fmt.Println("num1 < num2") } else { fmt.Println("num1 = num2") } }
說明一下:
- 執(zhí)行if語(yǔ)句時(shí),會(huì)依次判斷各個(gè)條件表達(dá)式,找到第一個(gè)結(jié)果為true的if分支并執(zhí)行對(duì)應(yīng)的代碼塊,如果所有條件表達(dá)式都不成立,則執(zhí)行最后的else代碼塊。
- if語(yǔ)句中的else if分支可以有一個(gè)或多個(gè),最后的else分支是可選的,if語(yǔ)句支持嵌套。
- 每一個(gè)if分支的
{}
都是必須的,就算代碼塊中只有一行代碼也不能省略,否則會(huì)產(chǎn)生報(bào)錯(cuò)。 - if語(yǔ)句中的條件表達(dá)式不需要用
()
包裹,雖然加上也不會(huì)報(bào)錯(cuò),但是不建議這樣做。 - if語(yǔ)句的條件表達(dá)式不能是賦值語(yǔ)句,比如
if flag = false
,否則會(huì)產(chǎn)生報(bào)錯(cuò)。
if后聲明變量
if語(yǔ)句支持在if后聲明一個(gè)變量,并以分號(hào)結(jié)束,然后在分號(hào)后面再給出條件表達(dá)式。如下:
package main import "fmt" func main() { // if后聲明變量 var num = 10 if base := 20; num < base { fmt.Println("num < base") } }
注意: 在if后聲明的變量?jī)H在if語(yǔ)句中有效。
switch語(yǔ)句
switch語(yǔ)句
Go中switch語(yǔ)句的基本語(yǔ)法如下:
使用案例如下:
package main import "fmt" func main() { // switch語(yǔ)句 var year, month int = 2024, 4 switch month { case 1, 3, 5, 7, 8, 10, 12: fmt.Println("這個(gè)月有31天") case 4, 6, 9, 11: fmt.Println("這個(gè)月有30天") case 2: day := 28 if (year%4 == 0 && year%100 != 0) || (year%400 == 0) { day++ } fmt.Printf("這個(gè)月有%d天\n", day) default: fmt.Println("無效月份!") } }
說明一下:
- 執(zhí)行switch語(yǔ)句時(shí),會(huì)將表達(dá)式依次與各個(gè)case后的表達(dá)式進(jìn)行比較,如果匹配成功,則執(zhí)行對(duì)應(yīng)case的代碼塊,如果所有case后的表達(dá)式都不匹配,則執(zhí)行最后的default代碼塊,最后的default是可選的。
- switch語(yǔ)句中的case可以有多個(gè),并且每個(gè)case后可以帶多個(gè)表達(dá)式,表達(dá)式之間使用逗號(hào)分隔。程序執(zhí)行完case語(yǔ)句的代碼塊后會(huì)直接退出switch控制,不需要在代碼塊最后加break語(yǔ)句。
- switch和case后面的表達(dá)式可以是常量值、變量、有返回值的函數(shù)調(diào)用等,case后的表達(dá)式如果是常量值(字面量),則要求不能重復(fù)。case后的各個(gè)表達(dá)式的值的數(shù)據(jù)類型,必須和switch后的表達(dá)式的數(shù)據(jù)類型一致。
switch后聲明變量
switch語(yǔ)句支持在switch后聲明一個(gè)變量,并以分號(hào)結(jié)束,然后在分號(hào)后面再給出表達(dá)式。如下:
package main import "fmt" func main() { // switch后聲明變量 switch year, month := 2024, 4; month { case 1, 3, 5, 7, 8, 10, 12: fmt.Println("這個(gè)月有31天") case 4, 6, 9, 11: fmt.Println("這個(gè)月有30天") case 2: day := 28 if (year%4 == 0 && year%100 != 0) || (year%400 == 0) { day++ } fmt.Printf("這個(gè)月有%d天\n", day) default: fmt.Println("無效月份!") } }
注意: 在switch后聲明的變量?jī)H在switch語(yǔ)句中有效。
switch穿透
在執(zhí)行完對(duì)應(yīng)的case語(yǔ)句的代碼塊后,程序會(huì)直接退出switch控制,如果希望程序繼續(xù)執(zhí)行下一個(gè)case語(yǔ)句的代碼塊,可以在代碼塊的最后通過fallthough關(guān)鍵字實(shí)現(xiàn)switch穿透。如下:
package main import "fmt" func main() { // switch穿透 var num int = 2 switch num { case 1: fmt.Println("case 1 block...") case 2: fmt.Println("case 2 block...") fallthrough // 繼續(xù)執(zhí)行下一個(gè)case的代碼塊 case 3: fmt.Println("case 3 block...") default: fmt.Println("default block...") } }
注意: switch穿透默認(rèn)只會(huì)穿透一層,如果希望執(zhí)行下面更多case的代碼塊,需要再次穿透。
Type Switch
switch語(yǔ)句可以用于判斷某個(gè)interface變量實(shí)際指向的變量類型,然后根據(jù)不同的類型執(zhí)行相應(yīng)的代碼邏輯。如下:
package main import "fmt" func main() { // Type Switch var num int = 10 var x interface{} = num switch t := x.(type) { case int: fmt.Println("int類型") case float64: fmt.Println("float64類型") case string: fmt.Println("string類型") default: fmt.Printf("未處理類型: %T\n", t) } }
說明一下:
- interface{}叫做空接口類型,其可以接收任意類型的變量值,在必要時(shí)需要通過類型斷言的方式獲取到變量原本的類型,而Type Switch就是一種類型斷言的方式。
無表達(dá)式的switch
switch語(yǔ)句后可以不帶表達(dá)式,這時(shí)在case后放條件表達(dá)式可以達(dá)到if語(yǔ)句的效果。如下:
package main import "fmt" func main() { // 無表達(dá)式的switch var num1, num2 int = 10, 20 switch { case num1 > num2: fmt.Println("num1 > num2") case num1 < num2: fmt.Println("num1 < num2") default: fmt.Println("num1 = num2") } }
說明一下:
- 這里每個(gè)case后也可以帶多個(gè)條件表達(dá)式,表達(dá)式之間使用逗號(hào)分隔。
循環(huán)控制
for循環(huán)語(yǔ)句
for循環(huán)語(yǔ)句
Go中for循環(huán)語(yǔ)句的基本語(yǔ)法如下:
使用案例如下:
package main import ( "fmt" ) func main() { // for循環(huán)語(yǔ)句 for i := 1; i <= 10; i++ { fmt.Printf("%d ", i) } fmt.Println() }
說明一下:
- 在執(zhí)行for循環(huán)語(yǔ)句時(shí),會(huì)先執(zhí)行循環(huán)遍歷初始化的語(yǔ)句,然后不斷根據(jù)循環(huán)條件判斷是否執(zhí)行循環(huán)體操作,如果循環(huán)條件為真則執(zhí)行一次循環(huán)體操作并進(jìn)行一次循環(huán)變量迭代,如果循環(huán)條件為假則退出for循環(huán)。
for循環(huán)的其他用法
在使用for循環(huán)語(yǔ)句時(shí),可以只在for后指明循環(huán)條件,而將循環(huán)變量的初始化和循環(huán)變量的迭代放在其他位置。如下:
使用案例如下:
package main import ( "fmt" ) func main() { // for循環(huán)語(yǔ)句 i := 1 for i <= 10 { fmt.Printf("%d ", i) i++ } fmt.Println() }
在使用for循環(huán)語(yǔ)句時(shí),以for{}
或for ; ; {}
表示無限循環(huán),通常需要配合break語(yǔ)句使用。如下:
使用案例如下:
package main import ( "fmt" ) func main() { // for循環(huán)語(yǔ)句 for { fmt.Println("這是一個(gè)死循環(huán)...") time.Sleep(time.Second) } }
說明一下:
- Sleep是time包中的一個(gè)函數(shù),用于阻塞當(dāng)前goroutine指定時(shí)間,其參數(shù)的類型是Duration。
- Second是time包中的一個(gè)Duration類型的常量,表示1秒。
for range循環(huán)
Go中的for range循環(huán),可以方便的對(duì)string、數(shù)組、切片、map等數(shù)據(jù)類型中的元素進(jìn)行遍歷。如下:
package main import ( "fmt" ) func main() { // for range循環(huán) var s string = "Hello 世界" for index, value := range s { fmt.Printf("s[%d] = %c\n", index, value) } }
在使用for range遍歷string時(shí),它會(huì)按照UTF-8編碼格式解析字符串,并以Unicode字符作為迭代的單位,每次迭代都會(huì)返回字符串中的一個(gè)Unicode字符(rune)和對(duì)應(yīng)的索引,無論是單字節(jié)的ASCII字符還是多字節(jié)的漢字,都會(huì)被正確地解析并返回。上述程序的運(yùn)行結(jié)果如下:
說明一下:
- 在for range循環(huán)中遍歷字符串時(shí),每次迭代會(huì)返回兩個(gè)值,第一個(gè)是字符的索引,第二個(gè)是字符的值,當(dāng)遍歷結(jié)束后會(huì)自動(dòng)退出for循環(huán)。
跳轉(zhuǎn)控制
break語(yǔ)句
break語(yǔ)句
Go中break語(yǔ)句可以用于跳出for循環(huán)語(yǔ)句或switch語(yǔ)句。如下:
package main import "fmt" func main() { // break語(yǔ)句 for i := 0; i < 10; i++ { if i == 6 { break } fmt.Printf("%d ", i) } fmt.Println() }
在多層循環(huán)嵌套語(yǔ)句中,break默認(rèn)只會(huì)跳出最近的for循環(huán),如果希望跳出更外層的for循環(huán),可以通過標(biāo)簽進(jìn)行指明。如下:
package main import "fmt" func main() { // break標(biāo)簽 label: for i := 0; i < 10; i++ { for j := 0; j < 10; j++ { for k := 0; k < 10; k++ { if i == 2 && j == 3 && k == 4 { break label } fmt.Printf("i = %d, j = %d, k = %d\n", i, j, k) } } } }
說明一下:
- 當(dāng)使用break語(yǔ)句指定標(biāo)簽時(shí),該標(biāo)簽必須用于標(biāo)記循環(huán)語(yǔ)句或switch語(yǔ)句的起始位置。
- 標(biāo)簽的命名應(yīng)該符合標(biāo)識(shí)符命名規(guī)則,標(biāo)簽名由用戶自定義。
continue語(yǔ)句
continue語(yǔ)句
Go中continue語(yǔ)句用于for循環(huán)中,可以停止當(dāng)前的迭代并進(jìn)入下一次迭代。如下:
package main import "fmt" func main() { // continue語(yǔ)句 for i := 0; i < 10; i++ { if i == 6 { continue } fmt.Printf("%d ", i) } fmt.Println() }
在多層循環(huán)嵌套語(yǔ)句中,continue默認(rèn)只會(huì)作用到最近的for循環(huán),如果希望作用到更外層的for循環(huán),可以通過標(biāo)簽進(jìn)行指明。如下:
package main import "fmt" func main() { // continue標(biāo)簽 label: for i := 0; i < 10; i++ { for j := 0; j < 10; j++ { for k := 0; k < 10; k++ { if i == 2 && j == 3 && k == 4 { continue label } fmt.Printf("i = %d, j = %d, k = %d\n", i, j, k) } } } }
說明一下:
- 當(dāng)使用continue語(yǔ)句指定標(biāo)簽時(shí),該標(biāo)簽必須用于標(biāo)記循環(huán)語(yǔ)句的起始位置。
goto語(yǔ)句
goto語(yǔ)句
Go中的goto語(yǔ)句用于無條件地跳轉(zhuǎn)到程序中指定標(biāo)簽的位置。如下:
package main import "fmt" func main() { // goto語(yǔ)句 for i := 0; i < 10; i++ { for j := 0; j < 10; j++ { for k := 0; k < 10; k++ { if i == 2 && j == 3 && k == 4 { goto label } fmt.Printf("i = %d, j = %d, k = %d\n", i, j, k) } } } label: fmt.Println("other code...") }
說明一下:
- goto語(yǔ)句通常與條件語(yǔ)句配合使用,用于實(shí)現(xiàn)條件轉(zhuǎn)移,跳出循環(huán)體等功能。
- Go程序中一般不主張使用goto語(yǔ)句,以免造成程序流程混亂。
return語(yǔ)句
return語(yǔ)句
Go中的return語(yǔ)句在方法或函數(shù)中使用,表示跳出所在的方法或函數(shù)。如下:
package main import "fmt" func main() { // return語(yǔ)句 for i := 0; i < 10; i++ { if i == 6 { return } fmt.Printf("%d ", i) } }
說明一下:
- 在普通函數(shù)中使用return語(yǔ)句,表示跳出當(dāng)前函數(shù),可以理解成終止函數(shù)。
- 在main函數(shù)中使用return語(yǔ)句,表示終止main函數(shù),即終止整個(gè)程序。
到此這篇關(guān)于Golang流程控制語(yǔ)句的具體使用的文章就介紹到這了,更多相關(guān)Golang流程控制語(yǔ)句內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go設(shè)計(jì)模式原型模式考查點(diǎn)及使用詳解
這篇文章主要為大家介紹了Go設(shè)計(jì)模式原型模式考查點(diǎn)及使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12詳解Golang如何優(yōu)雅的終止一個(gè)服務(wù)
后端服務(wù)通常會(huì)需要?jiǎng)?chuàng)建子協(xié)程來進(jìn)行相應(yīng)的作業(yè),但進(jìn)程接受到終止信號(hào)或正常結(jié)束時(shí),并沒有判斷或等待子協(xié)程執(zhí)行結(jié)束,下面這篇文章主要給大家介紹了關(guān)于Golang如何優(yōu)雅的終止一個(gè)服務(wù)的相關(guān)資料,需要的朋友可以參考下2022-03-03Go語(yǔ)言使用net/http實(shí)現(xiàn)簡(jiǎn)單登錄驗(yàn)證和文件上傳功能
這篇文章主要介紹了Go語(yǔ)言使用net/http實(shí)現(xiàn)簡(jiǎn)單登錄驗(yàn)證和文件上傳功能,使用net/http模塊編寫了一個(gè)簡(jiǎn)單的登錄驗(yàn)證和文件上傳的功能,在此做個(gè)簡(jiǎn)單記錄,需要的朋友可以參考下2023-07-07使用Go語(yǔ)言解析動(dòng)態(tài)JSON格式的方法
本篇文章主要介紹了使用Go語(yǔ)言解析動(dòng)態(tài)JSON格式的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12一文搞懂Go語(yǔ)言中defer關(guān)鍵字的使用
defer是golang中用的比較多的一個(gè)關(guān)鍵字,也是go面試題里經(jīng)常出現(xiàn)的問題。今天就來整理一下關(guān)于defer的學(xué)習(xí)使用,希望對(duì)需要的朋友有所幫助2022-09-09解決GO編譯時(shí)避免引入外部動(dòng)態(tài)庫(kù)的問題
最近碰到一個(gè)問題,有一個(gè)流量采集的組件中使用到了github.com/google/gopacket 這個(gè)庫(kù),這個(gè)庫(kù)使用一切正常,但是唯獨(dú)有一個(gè)缺點(diǎn),編譯后的二進(jìn)制文件依賴于libpcap.so的動(dòng)態(tài)庫(kù),這篇文章主要介紹了GO編譯時(shí)避免引入外部動(dòng)態(tài)庫(kù)的解決方法,需要的朋友可以參考下2022-10-10使用Gin框架搭建一個(gè)Go Web應(yīng)用程序的方法詳解
在本文中,我們將要實(shí)現(xiàn)一個(gè)簡(jiǎn)單的 Web 應(yīng)用程序,通過 Gin 框架來搭建,主要支持用戶注冊(cè)和登錄,用戶可以通過注冊(cè)賬戶的方式創(chuàng)建自己的賬號(hào),并通過登錄功能進(jìn)行身份驗(yàn)證,感興趣的同學(xué)跟著小編一起來看看吧2023-08-08Golang 如何限制木馬圖片上傳服務(wù)器的實(shí)例
本文主要介紹了Golang 如何限制木馬圖片上傳服務(wù)器的實(shí)例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02