Ответ
Разница в том, как метод взаимодействует с экземпляром структуры:
*Pointer receiver (`T`)**
- Работает с оригинальной структурой (может её изменять)
- Подходит для больших структур (избегает копирования)
- Может вызываться у указателя (
&s) и значения (автоматически разыменовывается)
Value receiver (T)
- Работает с копией структуры (изменения не сохраняются)
- Подходит для маленьких структур или когда изменение не нужно
- Может вызываться у значения и указателя (автоматически копируется)
type User struct {
Name string
}
// Pointer receiver
func (u *User) Rename(newName string) {
u.Name = newName // изменяет оригинал
}
// Value receiver
func (u User) Hello() string {
return "Hello, " + u.Name // работает с копией
}
Выбор зависит от семантики: нужно ли изменять объект и насколько он велик.