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

Dhr*_*hta 3 go

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

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

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

fab*_*ioM 7

您需要在本地竞赛中重新分配变量,以便闭包可以捕获值:

http://play.golang.org/p/-NO4S4qCZf

package main

import "fmt"
import "time"

func main() {
    l := []int{1, 2, 3}
    for idx, item := range l {
        theIdx, theItem := idx, item
        go func() {
            fmt.Println(theIdx, theItem)
        }()
    }
    time.Sleep(time.Second)
}
Run Code Online (Sandbox Code Playgroud)

或者将值传递给goroutine并向函数添加参数

http://play.golang.org/p/5gNToDWSQR

package main

import "fmt"
import "time"

func main() {
    l := []int{1, 2, 3}
    for idx, item := range l {
        go func(idx, item int) {
            fmt.Println(idx, item)
        }(idx, item)
    }
    time.Sleep(time.Second)
}
Run Code Online (Sandbox Code Playgroud)


Gia*_*ian 6

这是预期的,并记录在Go" Common Mistakes "页面中.您可以与设计决策争论,但这是已知的效果.

建议的方法是将值作为参数传递.