Sobes.tech
Back to tasks
Junior — Middle+
72

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

Get help with live coding in real time with Sobes Copilot
Task condition

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

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)
}