Golang闭包取值陷阱

Jackey Golang 1,357 次浏览 , 没有评论

运行一下代码查看输出情况:

func main() {
    tests1ice := []int{1, 2, 3, 4, 5}
    for _, v := range tests1ice {
        go func() {
            fmt.Println(v)
        }()
    }
    time.Sleep(time.Millisecond)
}

打印结果会是五个相同的值。

如果想逐个取出切片的元素,需要强制使用传值的方法,将代码书写成以下方式:

func main() {
    tests1ice := []int{1, 2, 3, 4, 5}
    for _, v := range tests1ice {
        go func(v int) {
            fmt.Println(v)
        }(v)
    }
    time.Sleep(time.Millisecond)
}

也可以这样处理:

func main() {
    data := []string{"one", "two", "three"}

    for _, v := range data {
        vCopy := v
        go func() {
            fmt.Println(vCopy)
        }()
    }

    time.Sleep(3 * time.Second)
    // 输出 one two three
}

 

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

Go