使用 goroutine 时,将函数调用包装到闭包中会导致意外行为。
考虑以下示例:
package main
import (
"log"
"sync"
"time"
)
var workerNum = 5
var wg sync.WaitGroup
func 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 个工作器的结果。
看起来闭包从外部作用域捕获变量的方式有问题。为什么会这样?闭包是否使用传递引用的方式来传递外部变量而不是传递值?
婷婷同学_
检查函数是否被作为 goroutine 调用
包装类的方法是使用类名调用还是用包装类的对象调用?
立即调用函数问题和javascript闭包问题
1、对无参函数调用的时候可以将[]包含的省略。 aa([11],[22])?
相关分类