为了账号安全,请及时绑定邮箱和手机立即绑定

使用 goroutine 时将函数调用包装到闭包中

使用 goroutine 时将函数调用包装到闭包中

Go
ibeautiful 2021-10-11 10:38:42
使用 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 回答

?
婷婷同学_

TA贡献1844条经验 获得超8个赞

这就是所有语言中闭包的工作方式,如果你想这样做,你必须隔离变量。

go func(i int) { startWorker(i) }(i)


查看完整回答
反对 回复 2021-10-11
  • 1 回答
  • 0 关注
  • 240 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信