使用goroutines时将函数调用包装到闭包中
在使用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
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)