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 协议》,转载必须注明作者和本文链接
推荐文章: