使用 goroutine 時(shí),將函數(shù)調(diào)用包裝到閉包中會(huì)導(dǎo)致意外行為??紤]以下示例:package mainimport ( "log" "sync" "time")var workerNum = 5var wg sync.WaitGroupfunc block() { dur := 300 * time.Millisecond //time.Sleep() select { case <- time.After(dur): {} }}func startWorker(worker int) { for i:=0; i < 3; i++{ log.Printf("Worker %d woke up! \n", worker) block() } wg.Done()}func main() { for i:=0; i < workerNum; i++ { //go func() { startWorker(i) }() go startWorker(i) } wg.Add(workerNum) wg.Wait()}在這里測試:http : //play.golang.org/p/nMlnTkbwVf可以看到包裝startWorker(i)成func() { startWorker(i) }()只調(diào)用第 5 個(gè)工作器的結(jié)果??雌饋黹]包從外部作用域捕獲變量的方式有問題。為什么會(huì)這樣?閉包是否使用傳遞引用的方式來傳遞外部變量而不是傳遞值?
使用 goroutine 時(shí)將函數(shù)調(diào)用包裝到閉包中
ibeautiful
2021-10-11 10:38:42