package maptask

Программа небезопасна: горутины одновременно пишут в обычную map, а sleep не гарантирует завершение. Нужны синхронизация записей и явное ожидание.

Короткий ответ

Что ответить на собеседовании

Программа небезопасна: горутины одновременно пишут в обычную 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 и не имеет гарантированного вывода.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее