gpt4 book ai didi

loops - 去审核-循环变量我被func文字捕获

转载 作者:行者123 更新时间:2023-12-01 22:31:04 25 4
gpt4 key购买 nike

在下面的代码中:

package main

import "fmt"

func main() {
for i := 0; i <= 9; i++ {
go func() {
fmt.Println(i)
}()
}
}

输出:
code$ 
code$ go install github.com/myhub/cs61a
code$ bin/cs61a
code$

上面的程序没有提供任何输出。

1)它们是否在10个例程中争夺单个内存位置 i

2)为什么上面的代码不打印自由变量 i的值?

最佳答案

有数据竞赛吗?

是的,请通过运行go run -race example.go进行确认。主goroutine写入i,其他goroutine无需任何同步即可读取它。参见Passing parameters to function closure; Why do these two for loop variations give me different behavior?Register multiple routes using range for loop slices/map

为什么上面的代码不打印任何内容?

因为当主goroutine结束时,您的程序也将结束。它不等待其他非main goroutine完成。参见No output from goroutine

固定

复制循环变量,并在闭包中使用它,并使用sync.WaitGroup等待启动的goroutine结束:

var wg sync.WaitGroup
for i := 0; i <= 9; i++ {
i2 := i
wg.Add(1)
go func() {
defer wg.Done()
fmt.Println(i2)
}()
}
wg.Wait()

这将输出(在 Go Playground上尝试):
9
0
2
1
6
5
3
7
8
4

另一种方法是将 i作为参数传递给启动的函数:
var wg sync.WaitGroup
for i := 0; i <= 9; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
fmt.Println(i)
}(i)
}
wg.Wait()

Go Playground上尝试这个。

关于loops - 去审核-循环变量我被func文字捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61641052/

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