使用 goroutine 时,将函数调用包装到闭包中会导致意外行为。考虑以下示例: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) }()只调用第 5 个工作器的结果。看起来闭包从外部作用域捕获变量的方式有问题。为什么会这样?闭包是否使用传递引用的方式来传递外部变量而不是传递值?
- 1 回答
- 0 关注
- 240 浏览
添加回答
举报
0/150
提交
取消