Sobes.tech
Senior

// все елементи у слайса трябва да са уникални + общо 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("дублирано увеличение") } checkIncrement[i] = 1 }() } time.Sleep(2 * time.Second) fmt.Println(len(data)) }

sobes.tech АИ

Одговор од АИ

U prikazanom kodu postoji nekoliko problema:

  • Istovremeni pristup slice-u data i mapi checkIncrement iz više gorutina bez sinhronizacije dovodi do uslova trke.
  • Korišćenje time.Sleep za čekanje završetka gorutina nije efikasno i pouzdano.

Da biste to ispravili:

  • Koristite mutex (sync.Mutex) za zaštitu zajedničkih podataka.
  • Primijenite sync.WaitGroup za čekanje završetka svih gorutina umesto time.Sleep.

Primer ispravljenog koda:

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("duplikat inkrementa: %d", val))
			}

			checkIncrement[val] = struct{}{}
			data = append(data, val)
		}(i)
	}

	wg.Wait()
	fmt.Println("Dužina podataka:", len(data))
}

Na ovaj način garantujemo jedinstvenost elemenata, ispravno dodavanje u slice i izbegavamo korišćenje time.Sleep za čekanje.