Назад к задачамПолучайте помощь с лайвкодингом в реальном времени с Sobes Copilot
Junior — Middle+
20
Получение уникальных значений массива через горутины
Условие задачи
Требуется использовать несколько горутин для получения только уникальных элементов из сгенерированного массива, при этом исключить дублирование результатов и отправить найденные уникальные числа в канал. Необходимо обеспечить корректную синхронизацию доступа к общему хранищу уже встреченных значений, чтобы избежать гонок данных.
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)
}