天天看點

golang之流程控制(注意點)Go在流程控制方面特點如下:for range 注意點:defer 控制語句

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()
}           

複制