與多數語言不同的是,Go語言中的循環語句只支持 for 關鍵字,而不支持 while 和 do-while 結構,關鍵字 for 的基本使用方法與C語言和[C++](http://c.biancheng.net/cplus/)中非常接近:
~~~
sum := 0
for i := 0; i < 10; i++ {
sum += i
}
~~~
可以看到比較大的一個不同在于 for 后面的條件表達式不需要用圓括號`()`括起來,Go語言還進一步考慮到無限循環的場景,讓開發者不用寫無聊的?`for(;;){}`和`do{} while(1);`,而直接簡化為如下的寫法:
~~~
sum := 0
for {
sum++
if sum > 100 {
break
}
}
~~~
使用循環語句時,需要注意的有以下幾點:
* 左花括號`{`必須與 for 處于同一行。
* Go語言中的 for 循環與C語言一樣,都允許在循環條件中定義和初始化變量,唯一的區別是,**Go語言不支持以逗號為間隔的多個賦值語句**,必須使用平行賦值的方式來初始化多個變量。
* Go語言的 for 循環同樣支持 continue 和 break 來控制循環,但是它提供了一個更高級的 break,可以選擇中斷哪一個循環,如下例:
~~~
for j := 0; j < 5; j++ {
for i := 0; i < 10; i++ {
if i > 5 {
break JLoop
}
fmt.Println(i)
}
}
JLoop:
// ...
~~~
上述代碼中,break 語句終止的是 JLoop 標簽處的外層循環。
## for 中的初始語句——開始循環時執行的語句
**初始語句是在第一次循環前執行的語句,一般使用初始語句執行變量初始化**,如果變量在此處被聲明,其作用域將被局限在這個 for 的范圍內。
初始語句可以被忽略,但是初始語句之后的分號必須要寫,代碼如下:
~~~
step := 2
for ; step > 0; step-- {
fmt.Println(step)
}
~~~
這段代碼將 step 放在 for 的前面進行初始化,for 中沒有初始語句,此時 step 的作用域就比在初始語句中聲明 step 要大。
## for 中的條件表達式——控制是否循環的開關
#### 1) 結束循環時帶可執行語句的無限循環
下面代碼忽略條件表達式,但是保留結束語句,代碼如下:
~~~
var i int
for ; ; i++ {
if i > 10 {
break
}
}
~~~
代碼說明如下:
* 第 3 行,無須設置 i 的初始值,因此忽略 for 的初始語句,兩個分號之間是條件表達式,也被忽略,此時循環會一直持續下去,for 的結束語句為 i++,每次結束循環前都會調用。
* 第 5 行,判斷 i 大于 10 時,通過 break 語句跳出 for 循環到第 9 行。
#### 2) 無限循環
上面的代碼還可以改寫為更美觀的寫法,代碼如下:
~~~
var i int
for {
if i > 10 {
break
}
i++
}
~~~
代碼說明如下:
* 第 3 行,忽略 for 的所有語句,此時 for 執行無限循環。
* 第 9 行,將 i++ 從 for 的結束語句放置到函數體的末尾是等效的,這樣編寫的代碼更具有可讀性。
無限循環在收發處理中較為常見,但需要無限循環有可控的退出方式來結束循環。
#### 3) 只有一個循環條件的循環
在上面代碼的基礎上進一步簡化代碼,將 if 判斷整合到 for 中,變為下面的代碼:
~~~
var i int
for i <= 10 {
i++
}
~~~
在代碼第 3 行中,將之前使用`if i>10{}`判斷的表達式進行取反,變為判斷 i 小于等于 10 時持續進行循環。
上面這段代碼其實類似于其他編程語言中的 while,在 while 后添加一個條件表達式,滿足條件表達式時持續循環,否則結束循環。
## for 中的結束語句——每次循環結束時執行的語句
在結束每次循環前執行的語句,如果循環被 break、goto、return、panic 等語句強制退出,結束語句不會被執行。
- 1.Go語言前景
- 2.Go語言環境搭建
- 3.Go語言的基本語法
- 3.1變量
- 3.1.1變量聲明
- 3.1.2變量初始化
- 3.1.3多個變量同時賦值
- 3.1.4匿名變量
- 3.1.5變量的作用域
- 3.1.6整型
- 3.1.7浮點類型
- 3.1.8復數
- 3.1.9bool類型
- 3.1.10字符串
- 3.1.11字符類型
- 3.1.12類型轉換
- 3.2常量
- 3.1.1const關鍵字
- 3.2.2模擬枚舉
- 4.Go語言的流程控制
- 4.2循環結構
- 4.3鍵值循環
- 4.4switch語句
- 4.5goto語句
- 4.6break語句
- 4.7continue語句
- 5.Go語言的函數
- 5.1函數聲明
- 5.2函數變量
- 5.3函數類型實現接口
- 5.4閉包
- 5.5可變參數
- 5.6defer(延遲執行語句)
- 5.7處理運行時錯誤
- 5.8宕機(panic)
- 5.9宕機恢復(recover)
- 5.10Test功能測試函數
- 6.Go語言的內置容器
- 6.1數組
- 6.2切片
- 6.3map
- 6.4sync.Map
- 6.5list
- 6.6range
- 7.Go語言的結構體
- 8.Go語言的接口
- 9.Go語言的常用內置包
- 10.Go語言的并發
- 11.Go語言的文件I/O操作
- 12.Go語言的網絡編程
- 13.Go語言的反射
- 14.Go語言的數據庫編程
- 15.Go語言密碼學算法
- 16.Go語言的gin框架
- 17.Go語言的網絡爬蟲
- 18.Go語言的編譯和工具鏈