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

使用goroutines时将函数调用包装到闭包中,go,closures,goroutine,Go,Closures,Goroutine,在使用goroutines时,将函数调用包装到闭包中会导致意外行为 考虑以下示例: 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(du

在使用goroutines时,将函数调用包装到闭包中会导致意外行为

考虑以下示例:

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()
}
主程序包
进口(
“日志”
“同步”
“时间”
)
var workerNum=5
var wg sync.WaitGroup
func block(){
dur:=300*时间。毫秒
//时间。睡眠()
挑选{

case所有语言中的闭包都是这样工作的,如果要这样做,必须隔离变量

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