前段时间在看面试题,也遇到一些不错的面试题,其中有一道很常见,记录一下,里面还有一点搞不明白的:
下面两段程序的输出是什么?
第一段:
func main() {
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
fmt.Println(i)
wg.Done()
}()
}
wg.Wait()
}
第二段:
func main() {
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func(n int) {
fmt.Println(n)
wg.Done()
}(i)
}
wg.Wait()
}
很多面试题解析里面说第一段的10个goroutine输出全部是10,我对这个结论是一直持怀疑态度的,因为输出什么,取决于那个goroutine里面代码被执行时外层i循环到哪里,经我实测,也符合我自己的想法。