協程中使用全局變量、局部變量、指針、map、切片等做爲參數時須要注意,此變量的值變化問題。 與for 循環,搭配使用更需謹慎。併發
1,內置函數時直接使用局部變量,未進行參數傳遞函數
package main import "fmt" func main() { for i := 0;i < 100; i++{ go func() { fmt.Println(i) }() } }
緣由分析:spa
協程開啓時候,可能多個協程拿到的變量i是同一個,這就致使輸出結果的不許確。指針
解決方案:code
package main import "fmt" func main() { for i := 0;i < 100; i++{ go func(i int) { fmt.Println(i) }(i) } }
2,地址傳遞的參數協程
package main import "fmt" 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 併發並不是當即啓動協程。blog