Пустой интерфейс 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.