How Interfaces Are Represented Internally in Go (iface and eface)

Go uses `eface` for empty interfaces and `iface` for non-empty ones, differing by the presence of an `itab` for method resolution.

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)
}