考虑以下 Go 代码(也在Go Playground 上):
package main
import "fmt"
import "time"
func main() {
for _, s := range []string{"foo", "bar"} {
x := s
func() {
fmt.Printf("s: %s\n", s)
fmt.Printf("x: %s\n", x)
}()
}
fmt.Println()
for _, s := range []string{"foo", "bar"} {
x := s
go func() {
fmt.Printf("s: %s\n", s)
fmt.Printf("x: %s\n", x)
}()
}
time.Sleep(time.Second)
}
此代码产生以下输出:
s: foo
x: foo
s: bar
x: bar
s: bar
x: foo
s: bar
x: bar
假设这不是一些奇怪的编译器错误,我很好奇为什么 a) s 的值在 goroutine 版本和常规 func 调用中的解释不同,以及 b) 为什么将它分配给循环内的局部变量有效两种情况。
相关分类