> Можно ли шарить данные между потоками (Go)

Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: Avito

Стек: Go

> Пример ответа

Да, в Go данные между горутинами (легковесными потоками) можно разделять, но это требует осторожности. Основной принцип Go - "не общайтесь через разделяемую память; разделяйте память через общение". Это означает, что предпочтительный способ - использовать каналы (channels) для передачи данных между горутинами, что обеспечивает безопасность без явных блокировок.

Однако, если необходимо разделять данные напрямую (например, для производительности), используйте примитивы синхронизации из пакета sync, такие как Mutex или RWMutex. Например:

GO
var mu sync.Mutex
var sharedData int
func writer() {
mu.Lock()
sharedData = 42
mu.Unlock()
}
func reader() {
mu.Lock()
val := sharedData
mu.Unlock()
fmt.Println(val)
}

Также можно использовать атомарные операции из sync/atomic для простых типов (int, bool, указатели). Важно помнить, что разделение данных без синхронизации приводит к гонкам данных (data race), которые можно обнаружить с помощью флага -race при запуске тестов или сборки. В Go принято минимизировать разделяемое состояние и отдавать предпочтение каналам для передачи владения данными.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью