Go函数写入同一映射

Go函数写入同一映射,go,concurrency,goroutine,Go,Concurrency,Goroutine,我正在努力熟悉围棋的常规动作。我编写了以下简单的程序,将1-10之间的数字平方存储在地图中 func main() { squares := make(map[int]int) var wg sync.WaitGroup for i := 1; i <= 10; i++ { go func(n int, s map[int]int) { s[n] = n * n }(i, squares) }

我正在努力熟悉围棋的常规动作。我编写了以下简单的程序,将1-10之间的数字平方存储在地图中

func main() {
    squares := make(map[int]int)
    var wg sync.WaitGroup
    for i := 1; i <= 10; i++ {
        go func(n int, s map[int]int) {
            s[n] = n * n
        }(i, squares)
    }
    wg.Wait()
    fmt.Println("Squares::: ", squares)
}
func main(){
正方形:=make(映射[int]int)
var wg sync.WaitGroup

对于i:=1;i,正如注释中指出的,您需要同步对地图的访问,并且您对
sync.WaitGroup
的使用不正确

请尝试以下方法:

func main() {
    squares := make(map[int]int)
    var lock sync.Mutex
    var wg sync.WaitGroup
    for i := 1; i <= 10; i++ {
        wg.Add(1) // Increment the wait group count
        go func(n int, s map[int]int) {
            lock.Lock() // Lock the map
            s[n] = n * n
            lock.Unlock()
            wg.Done() // Decrement the wait group count
        }(i, squares)
    }
    wg.Wait()
    fmt.Println("Squares::: ", squares)
}
func main(){
正方形:=make(映射[int]int)
var lock sync.Mutex
var wg sync.WaitGroup
因为i:=1;i才是您真正想要的,在这里修改代码以适合您的用例


p.S.必须添加一些睡眠,以便在调用所有go例程之前程序不会完成。

sync.WaitGroup没有魔力:在启动goroutine之前必须调用wg.add,一旦完成,必须在goroutine内部调用wg.Done。但是如果正确使用sync.WaitGroup,您的代码仍然是错误的:您不能写入相同的映射这是不允许的。如果只是确保所有goroutine都是通过syc.WaitGroup完成的,那么应该使用sync.Mutex来保护各个写入。