golang 语言协程
协程中使用全局变量、局部变量、指针、map、切片等作为参数时需要注意,此变量的值变化问题。 与for 循环,搭配使用更需谨慎。
1、内置函数时直接使用局部变量,未进行参数传递
func main() {
for i := 0; i < 100; i++ {
go func() {
fmt.Println(i)
}()
}
}
运行效果
func main() {
for i := 0; i < 100; i++ {
go func(i int) {
fmt.Println(i)
}(i)
}
}
运行效果
2。地址传递的参数
type Per struct {
name string
bh int
}
func main() {
p := &Per{}
for i := 0; i < 100; i++ {
p.bh = i
go func(p *Per) {
fmt.Println(p)
}(p)
}
}
分析: 导致以上非实际结果的原因是,go 之后并非立即启动协程的。
有疑问加站长微信联系(非本文作者)