dpdjpt5137 2014-06-13 00:58
浏览 15
已采纳

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

I am seeing incorrect values in the functions run as goroutines. They don't seem to be capturing the values from the scope in which they were invoked unless copied into new variables.

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

vs.

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

  • 写回答

3条回答 默认 最新

  • dongmou9260 2014-06-13 01:03
    关注

    You either need to re-assign the variable in the local context so that the closure can capture the values:

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

    or you pass the values to the goroutine and add parameters to the function

    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)
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 poi合并多个word成一个新word,原word中横版没了.
  • ¥15 【火车头采集器】搜狐娱乐这种列表页网址,怎么采集?
  • ¥15 求MCSCANX 帮助
  • ¥15 机器学习训练相关模型
  • ¥15 Todesk 远程写代码 anaconda jupyter python3
  • ¥15 我的R语言提示去除连锁不平衡时clump_data报错,图片以下所示,卡了好几天了,苦恼不知道如何解决,有人帮我看看怎么解决吗?
  • ¥15 在获取boss直聘的聊天的时候只能获取到前40条聊天数据
  • ¥20 关于URL获取的参数,无法执行二选一查询
  • ¥15 液位控制,当液位超过高限时常开触点59闭合,直到液位低于低限时,断开
  • ¥15 marlin编译错误,如何解决?