Go在流程控制方面特點如下:
- 沒有do和while循環,隻有一個廣義的for語句
- switch語句靈活多變,還可以用于類型判斷
- if語句和switch語句都可以包含一條初始化子語句
- break語句和continue語句可以跟一條label标簽語句,用于辨別需要終止或繼續的代碼塊
- defer語句可以使我們更加友善地執行異常捕獲和資源回收任務
- select語句也可以用于多分支選擇,但隻與通道配合使用
- go語句用于異步啟動goroutine并執行指定函數
for range 注意點:
- 對數組、切片或者字元串值進行疊代,:=左邊隻有一個疊代變量時,要注意隻能得到元素的索引,而不是元素。
- 疊代沒有任何元素的數組值、為nil的切片值、為nil的字典值、為“”的字元串值,不會執行for語句中的代碼。for在一開始就會結束。因為這些值長度是0
- 疊代為nil的通道值會讓目前流程永遠阻塞在for語句上。
defer 控制語句
package main
import (
"fmt"
)
//outerFunc是外圍函數
//defer執行順序是,先進後出,延遲調用指定的函數
//當外圍函數中語句執行完畢時,隻有延遲函數都執行完畢,外圍函數才真的結束
//當執行外媒函數中的return時,隻有延遲函數都執行完畢,外圍函數才傳回
//當外圍函數中的代碼引發運作錯誤時,隻有延遲函數執行完畢,運作時的錯誤才會被擴散至調用函數。
//是以defer常用在執行釋放資源或異常處理等收尾任務
//defer語句在外圍函數體中位置不限,數量不限
func printNumbers() {
for i := 0; i < 5; i++ {
//defer被壓進一個棧,函數完畢前一刻,先進後出,是以是43210
defer func() {
fmt.Printf("%d", i)
}()
}
}
func printNumbers1() {
for i := 0; i < 5; i++ {
//defer被壓進一個棧,函數完畢前一刻,先進後出,是以是43210
defer func(n int) {
fmt.Printf("%d", n)
}(i)
}
}
func printNumbers2() {
for i := 0; i < 5; i++ {
//defer被壓進一個棧,函數完畢前一刻,先進後出,是以是43210
defer func(n int) {
fmt.Printf("%d", n)
}(i * 2)
}
}
func main() {
printNumbers()
fmt.Println()
printNumbers1()
fmt.Println()
printNumbers2()
}
複制