为了账号安全,请及时绑定邮箱和手机立即绑定

为什么 Go 在 goroutines 中处理闭包的方式不同?

为什么 Go 在 goroutines 中处理闭包的方式不同?

Go
猛跑小猪 2021-08-16 19:08:56
考虑以下 Go 代码(也在Go Playground 上):package mainimport "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: foox: foos: barx: bars: barx: foos: barx: bar假设这不是一些奇怪的编译器错误,我很好奇为什么 a) s 的值在 goroutine 版本和常规 func 调用中的解释不同,以及 b) 为什么将它分配给循环内的局部变量有效两种情况。
查看完整描述

2 回答

  • 2 回答
  • 0 关注
  • 168 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信