go defer 關鍵字的需要注意的問題
阿新 • • 發佈:2019-02-14
一:
go defer 宣告的程式碼在goroutine 沒有執行:
package main import ( "fmt" "time" ) var ch chan int func main() { ch =make(chan int) for i:=0;i<10 ;i++ { go test(i) } for i:=0;i<10 ;i++ { <-ch } } func test(index int ){ time.Sleep(time.Second*1) defer fmt.Println("退出test ",index) ch<-index }
執行結果:
結果一:退出test 5
結果二:什麼都沒有
不是說好的defer 關鍵字 的意思是總會執行的嗎?結果是defer 關鍵字並沒有執行。
分析:當goroutine的主執行緒結束,goroutine 的子執行緒也會結束,剩下的無論什麼的程式碼都不會執行。因為子執行緒已經結束。
即使是子執行緒的defer 關鍵字的程式碼也不一定會執行。
二:defer 關鍵字的執行順序
package main import ( "fmt" ) func main() { defer_call() } func defer_call() { defer func() { fmt.Println("1") }() defer func() { fmt.Println("2") }() defer func() { fmt.Println("3") }() }
執行結果:
3
2
1
說明defer 關鍵字的執行順序是後進先出 。平常寫程式碼的時候應該注意defer 關鍵字的執行順序。