GO 的匿名函数使用注意

我们使用匿名函数时,为了方便常常使用当前作用域的变量

func main() {
    ch := save()
    for i:=0; i<10; i++{
        go func() {
            ch <-i //直接使用main函数的ch和i变量
        }()
    }
    time.Sleep(1e5) //等待子协程
}
func save() chan interface{}{
    ch := make(chan interface{})
    go func() {
        for{
            res := <-ch //直接使save函数的ch变量
            fmt.Printf("item: %d\n", res)
        }
    }()
    return ch
}

执行结果:

E:\go\projectOne\blog>go run main.go
item: 4
item: 7
item: 8
item: 8
item: 8
item: 8

原因是匿名函数使用主函数的变量,都是引用。如果要值传参,需要手动传入

func main() {
    ch := save()
    for i:=0; i<10; i++{
        go func(i int) {
            ch <-i
        }(i) //值传参
    }
    time.Sleep(1e10) //等待子协程
}

结果:

E:\go\projectOne\blog>go run main.go
item: 0
item: 3
item: 1
item: 2
item: 5
item: 4
item: 6
item: 7
item: 9
item: 8
本作品采用《CC 协议》,转载必须注明作者和本文链接
走出舒适区
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!