Tmp

From NovaOrdis Knowledge Base
Jump to navigation Jump to search

Passing Interfaces to Functions

With the example above, we declare a function f() that expects an interface A and we pass a B instance when invoking the function:

...

type A interface {
    m()
}

func (b B) m() {
    ...
}

func f(a A) {
    a.m()
}

...
b := B{1}
f(b)
...

Note that the B instance can be passed by value (as in the example above) or by reference (as in the example below). Both cases work for reasons explained in the Method Set associated with the Pointers of a Type section:

...
b := B{1}
f(&b)
...

or (same thing)

...
bPtr := new(B)
f(bPtr)
...

Interfaces as Fields

Interfaces can be used as fields in structs.

Implementation Details

An interface variable is a two-word data structure.

The first word contains a pointer to an internal table called iTable, which contains type information about the stored value: the concrete type of the value that has been stored and a list of methods associated with the value. The second word is a reference to the stored value.

The combination of type information and pointer binds the relationship between the two values.

DEPLETE: Go Concepts - The Type System