go 協程使用陷阱
阿新 • • 發佈:2019-01-02
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 之後並非立即啟動協程的。