Назад к задачам
Junior — Middle+
20

Получение уникальных значений массива через горутины

Получайте помощь с лайвкодингом в реальном времени с Sobes Copilot
Условие задачи

Требуется использовать несколько горутин для получения только уникальных элементов из сгенерированного массива, при этом исключить дублирование результатов и отправить найденные уникальные числа в канал. Необходимо обеспечить корректную синхронизацию доступа к общему хранищу уже встреченных значений, чтобы избежать гонок данных.

func main() {
    var seen = make(map[int]struct{})
    lock := sync.Mutex{}
    size := 1000

    numbers := make([]int, 0, size)
    for i := 0; i < size; i++ {
        numbers = append(numbers, rand.Intn(10)) // generate random ints
    }

    uniqChan := make(chan int, size)
    wg := sync.WaitGroup{}

    for i := 0; i < size; i++ {
        i := i
        wg.Add(1)
        go func() {
            defer wg.Done()
            if _, ok := seen[numbers[i]]; !ok {
                lock.Lock()
                seen[numbers[i]] = struct{}{}
                lock.Unlock()
                uniqChan <- numbers[i]
            }
        }()
    }

    wg.Wait()
    close(uniqChan)

    for val := range uniqChan {
        fmt.Println(val)
    }

    fmt.Println(uniqChan)
}