Структуры и методы: получатель по значению или по указателю
Метод с получателем по значению работает с копией структуры, поэтому изменить исходный объект он не может; метод с получателем-указателем работает с самим объектом. Правило выбора простое: указатель нужен, если метод меняет состояние или если копирование дорого либо запрещено — структура с sync.Mutex внутри копироваться не должна вообще, копия мьютекса не защищает ничего. Второе правило важнее первого: набор получателей у типа должен быть однородным. Если хотя бы один метод берёт указатель, все остальные тоже берут указатель, иначе читателю приходится помнить, какой вариант где. Отдельная тонкость — интерфейсы: если метод объявлен на указателе, то интерфейс реализует только *T, но не T, и попытка положить значение в интерфейс не скомпилируется. Вызовы при этом Go подставляет автоматически: на адресуемой переменной v.Method() превращается в (&v).Method().