我們使用匿名函式時,為了方便常常使用當前作用域的變數
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 協議》,轉載必須註明作者和本文連結