Программа небезопасна: горутины одновременно пишут в обычную map, а sleep не гарантирует завершение. Нужны синхронизация записей и явное ожидание.
package maptask
Программа небезопасна: горутины одновременно пишут в обычную map, а sleep не гарантирует завершение. Нужны синхронизация записей и явное ожидание.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
package maptask
import "fmt" import "time"
func Foo() { data := make(map[int]bool) for i := 0; i < 10; i++ { go func() { data[i] = true }() }
time.Sleep(time.Second * 1)
for k, v := range data {
fmt.Println(k, v)
}
}
Ответ
Программа небезопасна: горутины одновременно пишут в обычную map, а sleep не гарантирует завершение. Нужны синхронизация записей и явное ожидание.
func Foo() {
data := make(map[int]bool)
var mu sync.Mutex
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func(key int) {
defer wg.Done()
mu.Lock()
data[key] = true
mu.Unlock()
}(i)
}
wg.Wait()
for k, v := range data { fmt.Println(k, v) }
}
Нужны fmt и sync. Явный параметр исключает проблему захвата общей переменной цикла в старых версиях Go. После Wait все записи завершены, но порядок обхода map не определён. Исходный код может завершиться ошибкой concurrent map writes и не имеет гарантированного вывода.