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