go - 除非变量被复制,否则 go 例程中的闭包具有不正确的范围

标签 go

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

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

对比

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

最佳答案

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

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

关于go - 除非变量被复制,否则 go 例程中的闭包具有不正确的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24196200/

相关文章:

string - 从标准输入读取时,Nil指针取消引用行为

go - Robotgo无法收听多个事件

go - 如何使用golang过滤给定数据中的元素?

json - 将 JSON 解码为 UUID 类型

golang 运行时 : failed to create new OS thread (have 2049 already; errno=12)

http - 如何在 Golang 中为 http.Get() 请求设置超时?

算法:理解递归函数

http - Golang ListenAndServeTLS 在浏览器中不使用 https 时返回数据

Go: *Var 是 Var 的 "subclass"吗?

sql - 是否可以从 sql.Rows 获取 SQL 查询字符串?