В чем разница между pointer receiver и value receiver

«В чем разница между pointer receiver и value receiver» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Разница в том, как метод взаимодействует с экземпляром структуры:

*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 // работает с копией
}

Выбор зависит от семантики: нужно ли изменять объект и насколько он велик.