相关疑难解决方法(0)

为什么Golang在goroutines中处理不同的闭包?

考虑以下Golang代码(也在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)
}
Run Code Online (Sandbox Code Playgroud)

此代码生成以下输出:

s: foo
x: foo
s: bar
x: bar

s: bar
x: foo
s: bar
x: bar
Run Code Online (Sandbox Code Playgroud)

假设这不是一些奇怪的编译器错误,我很好奇为什么a)s的值在goroutine版本中然后在常规func调用中被解释不同而b)以及为什么将它分配给循环内部的局部变量两种情况.

closures go

5
推荐指数
2
解决办法
2422
查看次数

除非复制变量,否则go例程中的闭包具有不正确的作用域

我在作为goroutines运行的函数中看到不正确的值.除非复制到新变量中,否则它们似乎不会从调用它们的范围捕获值.

http://play.golang.org/p/YZYi-IVuYm

http://play.golang.org/p/z88G99XSi6

go

3
推荐指数
2
解决办法
1269
查看次数

标签 统计

go ×2

closures ×1