Перейти функции записи на одну карту - PullRequest
0 голосов
/ 06 ноября 2018

Я пытаюсь ознакомиться с процедурами го. Я написал следующую простую программу для хранения квадратов чисел от 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 голосов
/ 06 ноября 2018

sync.Map - это то, что вы на самом деле ищете, изменив код в соответствии с вашим вариантом использования,

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

P.S. Пришлось добавить немного сна, чтобы программа не заканчивала работу до вызова всех подпрограмм go.

0 голосов
/ 06 ноября 2018

Как указано в комментариях, вам нужно синхронизировать доступ к карте, и вы используете 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)
}
...