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

2024-01-10

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

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

vs.

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


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

http://play.golang.org/p/-NO4S4qCZf 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 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)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

go 例程中的闭包具有不正确的作用域,除非复制变量 的相关文章

随机推荐