Ответ 1
Как упоминалось в FAQ
Должен ли я определять методы значений или указателей?
func (s *MyStruct) pointerMethod() { } // method on pointer
func (s MyStruct) valueMethod() { } // method on value
Во-первых, и что самое главное, нужен ли метод для изменения получателя? Если это так, приемник должен быть указателем. (фрагменты и карты действуют как ссылки, поэтому их рассказ немного более тонкий, но, например, для изменения длины фрагмента в методе, который должен быть указатель.)
В приведенных выше примерах, если pointerMethod изменяет поля s, вызывающий будет видеть эти изменения, но valueMethod вызывается с копией аргумента вызывающего (что определение передачи значения), поэтому изменения, которые он делает, будут невидимы для вызывающего.
В вашем случае func (s Sample) Append(name string)
изменяет копию.
laher напоминает нам в комментариях, что использование значения вместо указателя также означает получение копировать и уважать неизменный характер объекта:
Вы хотите использовать non-pointer
valueMethod
, когда (для nstance) вы возвращаете частное свойство [value, полученное из] 'неизменяемого'.
См. "Почему приемники проходят по значению в Go?":
Может быть полезно, если, например, у вас есть маленький неизменяемый объект. Вызывающий может точно знать, что этот метод не изменяет его. Они не могут знать это, если приемник является указателем, не читая сначала код.