Во-первых, вам нужно знать о модели памяти go:
https://golang.org/ref/mem
Ключевым моментом для понимания является то, что эффекты записи переменных в горутине не обязательно видимы для другой горутины так же, как горутина наблюдает за ними. То есть, если горутина записывает значение в переменную a
, а затем в другую переменную b
, другая горутина может видеть эти записи в неопределенном порядке. Вот почему вам нужны параллельные примитивы, такие как каналы или мьютексы. Все, что произошло до операции канала или операции мьютекса, будет видно для всех горутин в этот момент. Операции
Atomi c предоставляют аналогичные гарантии, хотя модель памяти явно не указывает это.
Нелегко писать код с использованием атомики. Вы должны рассмотреть все возможные чередования выполнения, чтобы убедиться, что нет гонок. Придерживайтесь каналов и мьютексов. Правильный код лучше, чем быстрый, но пикантный код.