Материал проходит вычитку — возможны неточности.
Урок 43 из 118

Два слова интерфейса

Заглушка в тестах отвечала «не nil» и падала при первом же вызове. Миша полез внутрь и увидел: пустым было не само значение, а его начинка.

Главная мысль

на уровне языка интерфейс — пара «тип + значение»; раскладка в памяти (два слова) — деталь реализации; в интерфейс кладётся копия значения, а any — это интерфейс без методов.

Два слова

На уровне языка интерфейс — логическая пара: динамический тип и значение. Как именно эта пара устроена в памяти — деталь реализации runtime, и она может меняться; текущая раскладка полезна как модель для понимания typed nil, но не является языковой гарантией.

// упрощённо
type iface struct {
    tab  *itab     // тип
    data unsafe.Pointer // данные
}

В текущей реализации интерфейс хранит динамический тип (что за значение внутри) и указатель на данные. Поэтому передача интерфейса по значению дёшева: копируются два слова, сам объект остаётся на месте. Именно поэтому persist(st Storage,...) из прошлого урока не гоняет бэкенд целиком.

В интерфейс кладётся копия

type Namer interface{ Name() string }
type FileMeta struct{ Name string }
func (f FileMeta) Name() string { return f.Name }

f := FileMeta{Name: "report.pdf"}
var n Namer = f // в n — копия f

Для значения конкретного типа в интерфейс попадает копия. Для указателей исключения нет — копируется сам указатель.

Any — интерфейс без методов

var a any = "строка"
a = 42
a = FileMeta{Name: "bob"}

any — это интерфейс без методов: контракт без требований. Ему удовлетворяет любой тип. Полезно для «передать что угодно», но платить приходится потерей информации о типе — достать значение обратно можно только через type assertion (урок).

В следующем уроке

Вы узнаете:

  • как бокс больших значений в any влияет на аллокации
  • почему сравнение интерфейсов через == может паниковать
Задание · вопросы

Проверьте себя

Вопрос 1 из 3

p := Person{Name:"alice"}; var s Speaker = p; p.Name = "bob". Что вернёт s.Speak()?

Вопрос 2 из 3

Почему box(5) в any не аллоцирует память, а box(1000) — да?

Вопрос 3 из 3

Что такое any?

Итоги

Интерфейс — пара «тип + значение»; двухсловная раскладка — деталь реализации. Значение в интерфейсе — копия. any — интерфейс без методов, «любой тип».

Наш сайт собирает куки. Чтобы тебе было удобнее им пользоваться. Нажимая на кнопку, ты даёшь разрешение собирать куки