gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:33:28 26 4
gpt4 key购买 nike

<分区>

在使用 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 个 worker。

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com