2 回答
TA贡献1789条经验 获得超8个赞
在这种情况下,在 for 循环完成之前,不会调度任何 goroutine。为了使 for 循环中断,i
必须不小于或等于 5,因此在该点为 6。当 goroutine 运行时,它们每个都会打印i
在闭包中捕获的单个变量的值。
当您将i
参数作为参数传递给函数时,您将当前值复制到一个新变量中,并捕获当时的值。
TA贡献1719条经验 获得超6个赞
要回答您的问题,您必须传入i您的,func以便每个例程都有自己的i.
所以你的代码应该是这样的
func main() {
var wg sync.WaitGroup
for i := 1; i <= 5; i++ {
wg.Add(1)
go func(i int) {
fmt.Println(i)
time.Sleep(time.Second * 1)
wg.Done()
}(i)
}
wg.Wait()
}
我编写了这个实用程序函数来帮助并行化一组函数:
import "sync"
// Parallelize parallelizes the function calls
func Parallelize(functions ...func()) {
var waitGroup sync.WaitGroup
waitGroup.Add(len(functions))
defer waitGroup.Wait()
for _, function := range functions {
go func(copy func()) {
defer waitGroup.Done()
copy()
}(function)
}
}
所以在你的情况下,我们可以这样做
func main() {
functions := []func(){}
for i := 1; i <= 5; i++ {
function := func(i int) func() {
return func() {
fmt.Println(i)
}
}(i)
functions = append(functions, function)
}
Parallelize(functions...)
fmt.Println("Done")
}
如果你想使用 Parallelize 功能,你可以在这里找到它https://github.com/shomali11/util
- 2 回答
- 0 关注
- 143 浏览
添加回答
举报