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

考虑以下 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) 为什么将它分配给循环内的局部变量有效两种情况。


猛跑小猪
浏览 169回答 2
2回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go