Back to questions
Senior
3
// все элементы слайса должны быть уникальными + состоять из 1000 элементов в итоге // программа не должна висеть лишнее время из-за time.sleep func main() { checkIncrement := map[int]int32{} var data []int for i := 0; i < 1000; i++ { go func() { data = append(data, i) if _, found := checkIncrement[i]; found { fmt.Println(i) panic("duplicated increment") } checkIncrement[i] = 1 }() } time.Sleep(2 * time.Second) fmt.Println(len(data)) }
Companies where asked
FREEDOM LIFESTYLE
Answer from AI
sobes.tech AI
В представленном коде есть несколько проблем:
- Одновременный доступ к слайсу
dataи мапеcheckIncrementиз нескольких горутин без синхронизации приводит к гонкам данных. - Использование
time.Sleepдля ожидания завершения горутин неэффективно и ненадёжно.
Чтобы исправить:
- Используйте мьютекс (
sync.Mutex) для защиты общих данных. - Примените
sync.WaitGroupдля ожидания завершения всех горутин вместоtime.Sleep.
Пример исправленного кода:
package main
import (
"fmt"
"sync"
)
func main() {
checkIncrement := make(map[int]struct{})
var data []int
var mu sync.Mutex
var wg sync.WaitGroup
for i := 0; i < 1000; i++ {
wg.Add(1)
go func(val int) {
defer wg.Done()
mu.Lock()
defer mu.Unlock()
if _, found := checkIncrement[val]; found {
panic(fmt.Sprintf("duplicated increment: %d", val))
}
checkIncrement[val] = struct{}{}
data = append(data, val)
}(i)
}
wg.Wait()
fmt.Println("Length of data:", len(data))
}
Так мы гарантируем уникальность элементов, корректное добавление в слайс и не используем time.Sleep для ожидания.