golang|go 协程使用陷阱

golang 语言协程
协程中使用全局变量、局部变量、指针、map、切片等作为参数时需要注意,此变量的值变化问题。 与for 循环,搭配使用更需谨慎。
1、内置函数时直接使用局部变量,未进行参数传递

func main() { for i := 0; i < 100; i++ { go func() { fmt.Println(i) }() } }

运行效果
golang|go 协程使用陷阱
文章图片

func main() { for i := 0; i < 100; i++ { go func(i int) { fmt.Println(i) }(i) } }

运行效果
golang|go 协程使用陷阱
文章图片

2。地址传递的参数
type Per struct { name string bhint }func main() { p := &Per{} for i := 0; i < 100; i++ { p.bh = i go func(p *Per) { fmt.Println(p) }(p) } }

golang|go 协程使用陷阱
文章图片

【golang|go 协程使用陷阱】分析: 导致以上非实际结果的原因是,go 之后并非立即启动协程的。

    推荐阅读