Go represents interfaces internally using two distinct structures: iface for non-empty interfaces and eface for the empty interface{} type. An iface contains a pointer to an itab (interface table) describing the method set and a pointer to the data, while an eface contains only a pointer to the type description and the data.
// Simplified internal representation from cmd/compile/internal/abi-internal.md
// eface (empty interface): 2 words
type eface struct {
typ *type // Pointer to runtime type description
data unsafe.Pointer // Data field (direct or indirect)
}
// iface (non-empty interface): 2 words
type iface struct {
itab *itab // Pointer to interface table (method set + type)
data unsafe.Pointer // Data field (direct or indirect)
}