GO 的匿名函式使用注意

littlexiaoshuishui發表於2020-06-03

我們使用匿名函式時,為了方便常常使用當前作用域的變數

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 協議》,轉載必須註明作者和本文連結

相關文章