Вопрос направлен на проверку знания способов безопасного обмена данными между горутинами.
Данные между горутинами чаще всего передаются через каналы (chan), которые обеспечивают безопасную синхронизацию. Также можно использовать sync-пакет, например sync.Mutex или sync.WaitGroup, если данные хранятся в разделяемой памяти.
В Go основная концепция — "не делитесь памятью, а передавайте значения", и именно для этого используются каналы.
Каналы (Channels):
Обеспечивают безопасный обмен значениями.
Могут быть буферизированными или нет.
Пример:
ch := make(chan int)
go func() {
ch <- 42
}()
fmt.Println(<-ch)sync.Mutex / RWMutex:
Используется для защиты разделяемых структур от конкурентного доступа.
Пример:
var mu sync.Mutex
mu.Lock()
// чтение или запись
mu.Unlock()sync.WaitGroup:
Позволяет дождаться завершения набора горутин.
Не передаёт данные, но координирует выполнение.
sync/atomic:
Для атомарных операций с числовыми значениями.
Для передачи данных между горутинами — каналы.
Для общего доступа к структурам — Mutex.
Для ожидания завершения — WaitGroup.
Вывод:
Предпочтительно использовать каналы для передачи данных, а sync — для управления доступом и координации выполнения.