1. 程式人生 > >go 協程使用陷阱

go 協程使用陷阱

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 之後並非立即啟動協程的。