Go中的闭包在词法范围内。这意味着闭包内从“外部”范围引用的任何变量都不是副本,而是实际上是引用。一
for环竟重复使用相同的变量多次,所以你介绍的读/写之间的竞争条件
s变量。
但是
x正在分配一个新变量(带有
:=)并进行复制
s,这导致每次都是正确的结果。
通常,最佳做法是传递所需的任何参数,以使您没有引用。例:
for _, s := range []string{"foo", "bar"} { x := s go func(s string) { fmt.Printf("s: %sn", s) fmt.Printf("x: %sn", x) }(s)}


