一尘不染

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

go

我在以goroutines运行的函数中看到不正确的值。除非将它们复制到新变量中,否则它们似乎并没有从调用它们的范围中捕获值。

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

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


阅读 189

收藏
2020-07-02

共1个答案

一尘不染

您或者需要在本地上下文中重新分配变量,以便闭包可以捕获值:

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)
}

或者您将值传递给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)
}
2020-07-02