В Go можно записать значение в одной горутине, прочитать в другой — и получить именно тот результат, который ожидал.
Проблема в том, что Go этого не гарантирует без синхронизации.
Например, даже такой паттерн:
msg = "hello"
done = true
for !done {}
fmt.Println(msg)
может выглядеть абсолютно логично, но содержит две data race.
🔜 В разборе наглядно показывают, почему так происходит: от работы компилятора и CPU до memory model Go. А затем — чем правильно заменить самодельный флаг:
atomic → Mutex → WaitGroup → channels → sync.Once
Отдельно разбирается интересный эксперимент, где две горутины иногда обе читают 0, хотя на первый взгляд это кажется невозможным.
Если с конкурентностью в Go приходится работать не только на уровне «поставь mutex», этот разбор стоит посмотреть.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
