TGViewer
Go for Devs Go for Devs @go_for_devs · 852 subscribers
Post #22 368
🤷 Зачем в Go интерфейсы требуют точного совпадения?

В Go компилятор иногда автоматически преобразовывает значение тика к указателю на этот тип. Если вызвать метод с pointer-receiver на значении, всё будет работать:


type User struct {
Name string
}

func (u *User) SetName(name string) {
u.Name = name
}

func (u User) PrintName() {
fmt.Println(u.Name)
}

var u User
u.SetName("Alice") // Go превратил это в (&u).SetName("Alice")
u.PrintName() // Обычный value-receiver


Но стоит подключить интерфейсы — и магия исчезает:


type Named interface {
SetName(string)
PrintName()
}

var u User
var n Named

n = &u // OK: *User реализует оба метода
n = u // Ошибка: User не имеет SetName


Почему так?

У User (значения) в method set только методы с value-receiver. У *User — и value-, и pointer-receiver. Автоматическое «взятие адреса» при работе с интерфейсами запрещено, потому что интерфейс хранит копию значения, а не сам объект.

Копия:
* неадресуемая,
* неизменяемая.

Если бы мы могли взять &n.(User), получили бы указатель на временную копию внутри интерфейса, которая теряется при новом присваивании. Это небезопасно.

Итог

* Интерфейсы всегда копируют значение.
* Копия не имеет адреса и не может изменяться.
* Поэтому Go не делает auto-addressing, и method set интерфейса и method set конкретного значения должны строго совпадать.
  • ❤ 6
  • 👍 6
  • 🔥 2
More from @go_for_devs
  1. Sep 30, 2026Тут больше не будет новостей, статей и постов про Go. Go-разработчику сейчас важнее не син…
  2. Apr 16, 2026⚡️ Anthropic выпустили Claude Opus 4.7 Cursor зафиксировал рост с 58% до 70% на своём бенч…
  3. Feb 11, 2026🥳 Состоялся релиз Go 1.26 В релиз вошли несколько заметных изменений: 1. Функция new тепе…
  4. Jan 29, 2026Post #116
  5. Jan 22, 2026Помните, осенью мы писали про запуск опроса Go Survey 2025. Так вот, вчера команда Go опуб…
  6. Jan 21, 2026Философский подход к бэкенду
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →