1. 程式人生 > >go defer 關鍵字的需要注意的問題

go defer 關鍵字的需要注意的問題

一:

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 關鍵字的執行順序。