go協程使用陷阱(轉)

  協程中使用全局變量、局部變量、指針、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

相關文章
相關標籤/搜索