Игрался я тут с атомарными переменными, что бы вспомнить синтаксис и посмотреть что за приметивы появились в Go пакете Sync. Я горяче люблю этот пакет, за то что есть функции типа:
func atomic.CompareAndSwapInt32(addr *int32, old int32, new int32) (swapped bool) в которые можно передать любой вообще инт32 и это на мой взгляд намного правильнее, чем создавать примитив типа atomic.Int32, но он есть и вашему вниманию представляю его структуру:
type Int32 struct {
_ noCopy
v int32
}
Тут есть занимательный объект
_ noCopy, который по факту struct{}, реализующий интерфейс Locker (это что -copylocks checker из go vet находил копирование объекта). Однако он не фейлит вам сборку, если вы копируете такой объект, а только кидает предупреждение в go vet, но все равно лучше чем ничего)))К сожалению его нет внутри slice или map объекта, но если вы делаете свой кастомный объект, который лучше бы не копировать в Go - можете использовать noCopy, правда вам придется самим его проинициализировать он жеж приватный, но это не сложно
type noCopy struct{}
func (*noCopy) Lock() {}
func (*noCopy) Unlock() {}
но можно взять открытый пакет https://pkg.go.dev/github.com/savsgio/gotils/nocopy хотя на мо взгляд маленькая копия лучше маленькой зависимости