首页 > 试题广场 >

考虑以下 Go 代码片段。该程序执行后,最有可能的输出是什么

[单选题]
考虑以下 Go 代码片段。该程序执行后,最有可能的输出是什么?
package main
import (
    "fmt"
    "sync"
)
func main() {
    values := []int{10, 20, 30}
    var wg sync.WaitGroup
    wg.Add(len(values))
    for _, val := range values {
        go func() {
            fmt.Printf("%d ", val)
            wg.Done()
        }()
    }
    wg.Wait()
}
  • 10 20 30 (顺序可能不同)
  • 30 30 30 (顺序可能不同)
  • 程序会发生 panic,因为存在数据竞争
  • 10 10 10 (顺序可能不同)
答案错了吧
发表于 2025-10-04 11:03:18 回复(0)
go1.23修复了迭代器Bug,每个迭代器迭代出来的都是一个临时变量,现在不存在共享这个V了。这是个十年的错误,以前经常遇到,很莫名其妙。
老版本必需要这个赋值一次,所以官方修复了,本意是为了节省空间,但是架不住经常遇到for循环开启goroutine,在goroutine中访问这个堆上变量
package main

import "fmt"

func main() {
	var s = []int{1,2,3,4,5}
	for _,v := range s {
		val := v
		go func() {
			fmt.Println(val)
		}()
	}
}


发表于 2025-10-13 10:40:46 回复(0)