網站首頁 編程語言 正文
前言
哈嘍大家好,我是陳明勇,今天分享的知識是 Go 的循環結構。如果本文對你有幫助,不妨點個贊,如果你是 Go 語言初學者,不妨點個關注,一起成長一起進步,如果本文有錯誤的地方,歡迎指出!
循環結構
循環結構是指在程序中需要反復執行某個功能而設置的一種程序結構。有的編程語言,包含兩種循環結構,一種是 for
循環,另一種是 while
循環,而在 Go
里面,有且只有一種循環 —— for
循環。接下來看一個示例:
func main() { sum := 0 for num := 1; num <= 10; num++ { sum += num } println(sum) // 55 }
上述代碼實現的功能是在 1-10
之中累加求和,最后的結果為 55
。
- 上圖所示,
for
循環分為四個部分,第一部分num := 1
為循環前置語句,在這一部分,我們一般都會定義一些變量,這些變量被使用于第二部分和第三部分里。 -
第二部分是條件判斷表達式,也就是布爾表達式,多條件可以使用邏輯操作符進行連接。此部分的作用是判定循環是否繼續下去,圖中循環不終止的條件為
num <= 10
。只要條件成立,就會去執行第三部分. -
第三部分為循環體,只要循環不終止,程序就會重復執行循環體里面的代碼。上述例子中,循環體所做的事情就是累加
num
變量的值。 -
第四部分為循環后置語句,這一部分通常會對第一部分所定義的變量進行更新,例如上述例子中,對
num
進行自增。
for
循環執行順序是這樣的:
- 第一部分(只會執行一次)
- 第二部分(若布爾表達式的值為 false 則終止循環,不進行第三第四部分)
- 第三部分
- 第四部分,然后返回第二部分繼續執行。 對于上述四個部分,除了第三部分以外,其他部分都可以省略。如果只留第三部分,那么就形成死循環,以下為示例:
func main() { for { println("糟糕,死循環!") } }
在一些場景下,我們會利用死循環去做一些特定的事,但是最終還是要跳出死循環的。如何跳出死循環,就涉及到接下來要講的關鍵字 break
。
for-range
除了上面所講的普通 for
循環的形式,Go
里面還支持一種 for
循環,為 for-range
循環,這是一種什么循環形式呢?我們來看看例子:
import "fmt" func main() { nums := [4]int{1, 2, 3, 4} for i := 0; i < len(nums); i++ { fmt.Printf("下標:%d,元素:%d\n", i, nums[i]) } }
上述代碼,在循環前置語句中,聲明數組的下標,然后循環體通過下標值打印數組的元素,我們來看看使用 for-range
的代碼實現是怎么樣的:
import "fmt" func main() { nums := [4]int{1, 2, 3, 4} for i, num := range nums { fmt.Printf("下標:%d,元素:%d\n", i, num) } }
與普通 for
循環相比,for-range
的形式代碼量少了很多,除了循環體保留了下來,其余部分都融入到了 for-range
的語義里。上述代碼中,變量 i
為數組的下標索引,num
為數組中的元素值。如果我們所關注的只是數組的下標索引或者元素值,可以進行以下改造:
1.只關注下標索引
import "fmt" func main() { nums := [4]int{1, 2, 3, 4} for i := range nums { fmt.Printf("下標:%d\n", i) } }
僅僅定義一個 i
變量。
2.只關注元素值
import "fmt" func main() { nums := [4]int{1, 2, 3, 4} for _, num := range nums { fmt.Printf("元素值:%d\n", num) } }
索引位置使用 _
代替,表示忽略下標索引的接收。
3.下標索引和元素值都不關注
package main func main() { nums := [4]int{1, 2, 3, 4} for range nums { } }
break 和 continue 關鍵字
break
和 continue
關鍵字用于控制 for
循環的代碼流程,且只對最近的 for
循環有效(多層循環的情況下)。
break
退出 for
循環,循環體后續代碼不再執行。
continue
終止本輪循環,循環體后續代碼不再執行,進入下一輪循環。
示例
循環遍歷數組,如果在數組內找到元素值 6
,則退出循環。
func main() { nums := [5]int{1, 2, 6, 3, 4} for _, num := range nums { if num == 6 { break } println("元素:", num) } }
執行結果:
元素: 1
元素: 2
根據執行結果可知,遍歷數組到元素 6
的時候,使用 break
關鍵字,循環就終止了,后面的元素 3
和 4
沒有被打印出來。前面所提到的死循環也可以使用 break
關鍵字跳出循環。
循環遍歷數組,只打印奇數,忽略偶數。
func main() { nums := [5]int{1, 2, 6, 3, 4} for _, num := range nums { if num%2 == 0 { continue } println("元素:", num) } }
執行結果:
元素: 1
元素: 3
遇到偶數元素,就使用關鍵字 continue
結束本輪循環,開始下一輪循環。
label
在 Go
語言中,label
語句的作用是標記跳轉的目標。示例說明: 遍歷二維數組,找到元素 3
后結束跳出整個循環。
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]) } } }
執行結果:
第 1 輪:
元素值: 1
元素值: 2
第 2 輪:
第 3 輪:
元素值: 5
元素值: 6
外層循環一共要循環三輪,根據結果可知,使用 break
關鍵字,并沒有跳出整個循環。在第二輪循環之后,進入內層循環,找到元素 4
,break
關鍵字只終止了內層循環,外層循環的第三輪還會繼續執行,這并不是我們想要的結果。要想達到目標結果,需要結合 label
語句實現:
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]) } } }
執行結果:
第 1 輪:
元素值: 1
元素值: 2
第 2 輪:
在第一層循環前面,使用 label
語句,用 outerLoop
進行標記,然后在 break
關鍵字后面加上這個標記,就能實現跳出整個循環。
小結
本文首先介紹了 Go
里面的普通 for
循環,然后由普通 for
循環引出了 for-range
循環,對于數組、切片、Map
等復合數據結構,遍歷方式使用 for-range
的形式會更好,特殊的復合數據類型如 Map
,遍歷方式也只能用 for-range
的形式。本文還提到了 break
、continue
和 label
關鍵字,通過案例介紹了它們的使用場景。
原文鏈接:https://juejin.cn/post/7170721023917031431
相關推薦
- 2023-12-06 Access denied for user root @ localhost (using p
- 2022-03-03 【css】page-break-after 頁面打印分頁屬性
- 2022-05-12 Kotlin 判斷泛型類型 reified
- 2022-05-22 Flutter應用框架搭建之屏幕適配詳解_Android
- 2023-03-26 Python中的“_args”和“__kwargs”用法詳解_python
- 2022-12-11 C語言中求解圖形的問題_C 語言
- 2022-04-25 C#條件拼接Expression<Func<T,?bool>>的使用_C#教程
- 2022-04-25 ASP.NET?Core中Razor頁面的Handlers處理方法詳解_基礎應用
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支