TGViewer
Библиотека Go-разработчика | Golang Библиотека Go-разработчика | Golang @goproglib · 24.1K subscribers
Post #7458 4.09K
💡 Что внутри у any

Раньше мы разбирали, что обычный интерфейс это структура из двух указателей, на таблицу типа и на данные. Пустой интерфейс, он же any, устроен похоже, но проще, и об этом стоит знать отдельно.

🟢 Две разные структуры

Непустой интерфейс в рантайме это iface. Внутри у него itab, где лежат тип интерфейса, конкретный тип, хеш и таблица методов. У пустого интерфейса методов нет, значит и таблица методов ему не нужна. Поэтому any представлен другой, более лёгкой структурой, eface.


type eface struct {
_type *_type
data unsafe.Pointer
}


Здесь _type это указатель на описание конкретного типа, а data это указатель на само значение. Никакого itab и списка методов, потому что вызывать через any всё равно нечего. Из-за этого приведение типа и type switch по any сводятся к сравнению указателя на тип, без похода в таблицу методов.

🟢 Классическая ловушка с nil

Из устройства следует известный подвох. Интерфейс равен nil, только когда оба поля пустые, и тип, и данные. Стоит завернуть в интерфейс нетипизированный `nil`-указатель, и получится интерфейс, у которого тип уже не пустой.


var p *MyError = nil
var err error = p
fmt.Println(err == nil) // false


Тип внутри err теперь *MyError, поэтому сравнение с nil даёт false, хотя указатель внутри нулевой. Отсюда практичное правило. Возвращайте из функций именно nil литералом, а не заранее объявленную типизированную переменную, если хотите, чтобы вызывающий код честно увидел nil.

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека Go-разработчика

#GoDeep
  • ❤ 6
  • 👍 3
More from @goproglib
  1. Sep 21, 2026🤩 Go с нуля: серия базовых шпаргалок Собрали путь от Hello, World! до goroutines, channel…
  2. Sep 20, 2026🤔 Вопрос с собеседования по Go Что выведет программа? ❤️ — [1 2 3 4 5] / [1 2 10] 🔥 — [1…
  3. Sep 19, 2026🛠 Rune — open-source IDE и terminal multiplexer на Go Rune объединяет IDE, терминал и AI-…
  4. Sep 18, 2026🤩 SQLite вместо отдельного брокера в Go Watermill поддерживает SQLite Pub/Sub — сообщения…
  5. Sep 17, 2026⚡️ Go 1.27 ускоряет небольшие аллокации В Go 1.27 появился size-specialized memory allocat…
  6. Sep 16, 2026🛠 Напишите конфиг сами viper — самая частая рекомендация для конфигурации в Go. Он умеет…
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 →