Как решается проблема с Data Race в Go

«Как решается проблема с Data Race в Go» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Go проблема data race решается с помощью примитивов синхронизации из пакета sync:

  1. Мьютексы (sync.Mutex, sync.RWMutex) - базовый способ:
var mu sync.Mutex
var counter int

func increment() {
    mu.Lock()
    counter++
    mu.Unlock()
}
  1. Атомарные операции (sync/atomic):
var counter int64

func increment() {
    atomic.AddInt64(&counter, 1)
}
  1. Каналы - идиоматичный способ для Go:
ch := make(chan int, 1)

// Запись
ch <- value

// Чтение
value := <-ch

Для обнаружения гонок используйте флаг -race:

go run -race main.go

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