Tmp: Difference between revisions
Line 1: | Line 1: | ||
==Passing Interfaces to Functions== | ==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: | With the example above, we declare a function f() that expects an interface A and we pass a B instance when invoking the function: |
Revision as of 22:35, 13 August 2024
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