Sobes.tech
Назад к вопросам
Senior
4

// все элементы слайса должны быть уникальными + состоять из 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)) }

Компании, где спрашивали
FREEDOM LIFESTYLE

Ответ от нейросети

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 для ожидания.