一文帶你熟悉Go語言中的for循環(huán)
前言
哈嘍大家好,我是陳明勇,今天分享的知識是 Go 的循環(huán)結(jié)構(gòu)。如果本文對你有幫助,不妨點(diǎn)個贊,如果你是 Go 語言初學(xué)者,不妨點(diǎn)個關(guān)注,一起成長一起進(jìn)步,如果本文有錯誤的地方,歡迎指出!
循環(huán)結(jié)構(gòu)
循環(huán)結(jié)構(gòu)是指在程序中需要反復(fù)執(zhí)行某個功能而設(shè)置的一種程序結(jié)構(gòu)。有的編程語言,包含兩種循環(huán)結(jié)構(gòu),一種是 for 循環(huán),另一種是 while 循環(huán),而在 Go 里面,有且只有一種循環(huán) —— for 循環(huán)。接下來看一個示例:
func main() {
sum := 0
for num := 1; num <= 10; num++ {
sum += num
}
println(sum) // 55
}

上述代碼實(shí)現(xiàn)的功能是在 1-10 之中累加求和,最后的結(jié)果為 55。
- 上圖所示,
for循環(huán)分為四個部分,第一部分num := 1為循環(huán)前置語句,在這一部分,我們一般都會定義一些變量,這些變量被使用于第二部分和第三部分里。 - 第二部分是條件判斷表達(dá)式,也就是布爾表達(dá)式,多條件可以使用邏輯操作符進(jìn)行連接。此部分的作用是判定循環(huán)是否繼續(xù)下去,圖中循環(huán)不終止的條件為
num <= 10。只要條件成立,就會去執(zhí)行第三部分. - 第三部分為循環(huán)體,只要循環(huán)不終止,程序就會重復(fù)執(zhí)行循環(huán)體里面的代碼。上述例子中,循環(huán)體所做的事情就是累加
num變量的值。 - 第四部分為循環(huán)后置語句,這一部分通常會對第一部分所定義的變量進(jìn)行更新,例如上述例子中,對
num進(jìn)行自增。
for 循環(huán)執(zhí)行順序是這樣的:
- 第一部分(只會執(zhí)行一次)
- 第二部分(若布爾表達(dá)式的值為 false 則終止循環(huán),不進(jìn)行第三第四部分)
- 第三部分
- 第四部分,然后返回第二部分繼續(xù)執(zhí)行。 對于上述四個部分,除了第三部分以外,其他部分都可以省略。如果只留第三部分,那么就形成死循環(huán),以下為示例:
func main() {
for {
println("糟糕,死循環(huán)!")
}
}在一些場景下,我們會利用死循環(huán)去做一些特定的事,但是最終還是要跳出死循環(huán)的。如何跳出死循環(huán),就涉及到接下來要講的關(guān)鍵字 break。
for-range
除了上面所講的普通 for 循環(huán)的形式,Go 里面還支持一種 for 循環(huán),為 for-range 循環(huán),這是一種什么循環(huán)形式呢?我們來看看例子:
import "fmt"
func main() {
nums := [4]int{1, 2, 3, 4}
for i := 0; i < len(nums); i++ {
fmt.Printf("下標(biāo):%d,元素:%d\n", i, nums[i])
}
}
上述代碼,在循環(huán)前置語句中,聲明數(shù)組的下標(biāo),然后循環(huán)體通過下標(biāo)值打印數(shù)組的元素,我們來看看使用 for-range 的代碼實(shí)現(xiàn)是怎么樣的:
import "fmt"
func main() {
nums := [4]int{1, 2, 3, 4}
for i, num := range nums {
fmt.Printf("下標(biāo):%d,元素:%d\n", i, num)
}
}與普通 for 循環(huán)相比,for-range 的形式代碼量少了很多,除了循環(huán)體保留了下來,其余部分都融入到了 for-range 的語義里。上述代碼中,變量 i 為數(shù)組的下標(biāo)索引,num 為數(shù)組中的元素值。如果我們所關(guān)注的只是數(shù)組的下標(biāo)索引或者元素值,可以進(jìn)行以下改造:
1.只關(guān)注下標(biāo)索引
import "fmt"
func main() {
nums := [4]int{1, 2, 3, 4}
for i := range nums {
fmt.Printf("下標(biāo):%d\n", i)
}
}
僅僅定義一個 i 變量。
2.只關(guān)注元素值
import "fmt"
func main() {
nums := [4]int{1, 2, 3, 4}
for _, num := range nums {
fmt.Printf("元素值:%d\n", num)
}
}
索引位置使用 _ 代替,表示忽略下標(biāo)索引的接收。
3.下標(biāo)索引和元素值都不關(guān)注
package main
func main() {
nums := [4]int{1, 2, 3, 4}
for range nums {
}
}break 和 continue 關(guān)鍵字
break 和 continue 關(guān)鍵字用于控制 for 循環(huán)的代碼流程,且只對最近的 for 循環(huán)有效(多層循環(huán)的情況下)。
break
退出 for 循環(huán),循環(huán)體后續(xù)代碼不再執(zhí)行。
continue
終止本輪循環(huán),循環(huán)體后續(xù)代碼不再執(zhí)行,進(jìn)入下一輪循環(huán)。
示例
循環(huán)遍歷數(shù)組,如果在數(shù)組內(nèi)找到元素值 6,則退出循環(huán)。
func main() {
nums := [5]int{1, 2, 6, 3, 4}
for _, num := range nums {
if num == 6 {
break
}
println("元素:", num)
}
}
執(zhí)行結(jié)果:
元素: 1
元素: 2
根據(jù)執(zhí)行結(jié)果可知,遍歷數(shù)組到元素 6 的時候,使用 break 關(guān)鍵字,循環(huán)就終止了,后面的元素 3 和 4 沒有被打印出來。前面所提到的死循環(huán)也可以使用 break 關(guān)鍵字跳出循環(huán)。
循環(huán)遍歷數(shù)組,只打印奇數(shù),忽略偶數(shù)。
func main() {
nums := [5]int{1, 2, 6, 3, 4}
for _, num := range nums {
if num%2 == 0 {
continue
}
println("元素:", num)
}
}執(zhí)行結(jié)果:
元素: 1
元素: 3
遇到偶數(shù)元素,就使用關(guān)鍵字 continue 結(jié)束本輪循環(huán),開始下一輪循環(huán)。
label
在 Go 語言中,label 語句的作用是標(biāo)記跳轉(zhuǎn)的目標(biāo)。示例說明: 遍歷二維數(shù)組,找到元素 3 后結(jié)束跳出整個循環(huán)。
func main() {
nums := [][]int{
{1, 2},
{3, 4},
{5, 6},
}
for i := 0; i < len(nums); i++ {
println("第", i+1, "輪:")
for j := 0; j < len(nums[i]); j++ {
if nums[i][j] == 3 {
break
}
println("元素值:", nums[i][j])
}
}
}
執(zhí)行結(jié)果:
第 1 輪:
元素值: 1
元素值: 2
第 2 輪:
第 3 輪:
元素值: 5
元素值: 6
外層循環(huán)一共要循環(huán)三輪,根據(jù)結(jié)果可知,使用 break 關(guān)鍵字,并沒有跳出整個循環(huán)。在第二輪循環(huán)之后,進(jìn)入內(nèi)層循環(huán),找到元素 4,break 關(guān)鍵字只終止了內(nèi)層循環(huán),外層循環(huán)的第三輪還會繼續(xù)執(zhí)行,這并不是我們想要的結(jié)果。要想達(dá)到目標(biāo)結(jié)果,需要結(jié)合 label 語句實(shí)現(xiàn):
func main() {
nums := [][]int{
{1, 2},
{3, 4},
{5, 6},
}
outerLoop:
for i := 0; i < len(nums); i++ {
println("第", i+1, "輪:")
for j := 0; j < len(nums[i]); j++ {
if nums[i][j] == 3 {
break outerLoop
}
println("元素值:", nums[i][j])
}
}
}執(zhí)行結(jié)果:
第 1 輪:
元素值: 1
元素值: 2
第 2 輪:
在第一層循環(huán)前面,使用 label 語句,用 outerLoop 進(jìn)行標(biāo)記,然后在 break 關(guān)鍵字后面加上這個標(biāo)記,就能實(shí)現(xiàn)跳出整個循環(huán)。
小結(jié)
本文首先介紹了 Go 里面的普通 for 循環(huán),然后由普通 for 循環(huán)引出了 for-range 循環(huán),對于數(shù)組、切片、Map 等復(fù)合數(shù)據(jù)結(jié)構(gòu),遍歷方式使用 for-range 的形式會更好,特殊的復(fù)合數(shù)據(jù)類型如 Map,遍歷方式也只能用 for-range 的形式。本文還提到了 break、continue 和 label 關(guān)鍵字,通過案例介紹了它們的使用場景。
到此這篇關(guān)于一文帶你熟悉Go語言中的for循環(huán)的文章就介紹到這了,更多相關(guān)Go語言 for循環(huán)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入探討Golang中如何進(jìn)行并發(fā)發(fā)送HTTP請求
在?Golang?領(lǐng)域,并發(fā)發(fā)送?HTTP?請求是優(yōu)化?Web?應(yīng)用程序的一項(xiàng)重要技能,本文探討了實(shí)現(xiàn)此目的的各種方法,文中的示例代碼講解詳細(xì),希望對大家有所幫助2024-01-01
Golang實(shí)現(xiàn)web文件共享服務(wù)的示例代碼
這篇文章主要介紹了Golang實(shí)現(xiàn)web文件共享服務(wù)的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-10-10
golang 如何用反射reflect操作結(jié)構(gòu)體
這篇文章主要介紹了golang 用反射reflect操作結(jié)構(gòu)體的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04
Go語言使用MongoDB數(shù)據(jù)庫詳細(xì)步驟
mongodb是一種高性能、開源、文檔型的nosql數(shù)據(jù)庫,被廣泛應(yīng)用于web應(yīng)用、大數(shù)據(jù)以及云計(jì)算領(lǐng)域,下面這篇文章主要給大家介紹了關(guān)于Go語言使用MongoDB數(shù)據(jù)庫的詳細(xì)步驟,需要的朋友可以參考下2024-05-05
源碼分析Go語言中g(shù)ofmt實(shí)現(xiàn)原理
gofmt?是?Go?語言官方提供的一個工具,用于自動格式化?Go?源代碼,使其符合?Go?語言的官方編碼風(fēng)格,本文給大家源碼詳細(xì)分析了Go語言中g(shù)ofmt實(shí)現(xiàn)原理,并通過圖文和代碼講解的非常詳細(xì),需要的朋友可以參考下2024-03-03

