Go函数写入同一张地图

时间:2018-11-06 07:33:02

标签: go concurrency goroutine

我正在尝试熟悉go例程。我编写了以下简单程序,将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)
}

最后,它将打印一个空白地图。但是在旅途中,地图是通过引用传递的。为什么要打印空白地图?

2 个答案:

答案 0 :(得分:2)

如评论中所指出,您需要同步对地图的访问,并且您对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)
}

答案 1 :(得分:-3)

sync.Map是您真正要寻找的,修改了代码以适合您的用例,

https://play.golang.org/p/DPLHiMsH5R8

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