Интерфейс — это пара указателей: (type, value). Пустой интерфейс any — это eface{_type, data}. Непустой интерфейс — iface{tab, data}, где tab (itable) содержит информацию о типе и таблицу методов.
Метод вызывается через vtable — один уровень indirection. Интерфейс == nil только когда оба поля nil. Частая ловушка:
var p *MyStruct = nil
var i error = p
// i != nil, потому что type != nil
Размер интерфейса — 16 байт (два указателя). Присвоение конкретного типа интерфейсу может вызвать аллокацию на хипе.