go協程使用陷阱(轉)


  協程中使用全局變量、局部變量、指針、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 並發並非立即啟動協程。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM