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

使用 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 个工作器的结果。


看起来闭包从外部作用域捕获变量的方式有问题。为什么会这样?闭包是否使用传递引用的方式来传递外部变量而不是传递值?


ibeautiful
浏览 243回答 1
1回答

婷婷同学_

这就是所有语言中闭包的工作方式,如果你想这样做,你必须隔离变量。go&nbsp;func(i&nbsp;int)&nbsp;{&nbsp;startWorker(i)&nbsp;}(i)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go