До Go 1.19 атомарные операции требовали передачи указателя и ручного контроля выравнивания на 32-bit платформах:
// Старый API (до Go 1.19) - неудобно:
var counter int64
atomic.AddInt64(&counter, 1) // нужен &
val := atomic.LoadInt64(&counter) // нужен &
// На 32-bit: counter должен быть выровнен по 8 байт!
// Новый API (Go 1.19+) - типобезопасно:
var counter atomic.Int64
counter.Add(1) // метод, без &
val := counter.Load() // чисто и безопасно
counter.Store(0)
old := counter.Swap(42)
swapped := counter.CompareAndSwap(42, 100)
Доступные atomic-типы: atomic.Bool, atomic.Int32, atomic.Int64, atomic.Uint32, atomic.Uint64, atomic.Uintptr, atomic.Pointer[T].
atomic.Pointer[T] (Go 1.19+) - типобезопасная замена atomic.Value для указателей конкретного типа.