Почему пустой интерфейс приводится к любому типу?

Middle
679 просмотров
AFK Offer AI

Пустой интерфейс interface{} (или any с Go 1.18) не содержит методов. Любой тип в Go имеет как минимум ноль методов, а значит автоматически реализует пустой интерфейс.

var x any
x = 42
x = "hello"
x = []int{1, 2, 3}

Внутри интерфейсная переменная хранит два указателя: на таблицу типа (itab) и на данные. Для пустого интерфейса (eface) — только указатель на тип и на данные.

Чтобы получить конкретный тип обратно:

val, ok := x.(int) // type assertion
switch v := x.(type) { // type switch
case int: ...
case string: ...
}

Это аналог Object в Java или void* в C, но с runtime type safety.

Следующий вопрос

Как интерпретировать результаты benchmark?