Почему переменные не подходят для записи и чтения горутиной

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

Ответ

Использование обычных переменных для обмена данными между горутинами небезопасно из-за race condition (гонки данных). Горутины выполняются конкурентно, и без синхронизации возможны конфликты при одновременном чтении/записи.

Пример проблемы:

var counter int

func increment() {
    counter++
}

func main() {
    for i := 0; i < 1000; i++ {
        go increment()
    }
    time.Sleep(time.Second)
    fmt.Println(counter) // Результат непредсказуем
}

Для безопасного обмена данными используйте:

  • Каналы (chan)
  • Мьютексы (sync.Mutex)
  • Атомарные операции (sync/atomic)
  • Примитивы из пакета sync (WaitGroup, RWMutex и др.)