Два слова интерфейса
Заглушка в тестах отвечала «не 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влияет на аллокации - почему сравнение интерфейсов через
==может паниковать
Проверьте себя
p := Person{Name:"alice"}; var s Speaker = p; p.Name = "bob". Что вернёт s.Speak()?
Почему box(5) в any не аллоцирует память, а box(1000) — да?
Что такое any?
правильных ответов
Интерфейс — пара «тип + значение»; двухсловная раскладка — деталь реализации. Значение в интерфейсе — копия. any — интерфейс без методов, «любой тип».
10 000 ₽ · 60 минут · онлайн