Interfaces

Interfaces are a duck typing feature.


Implementation

An interface is written as:

type Duck interface {
    Walk(int)
    Quack() string
}

This is then implemented like:

type Mallard struct {
    bornAt int
    position int
}

func (m *Mallard) Walk(meters int) {
    m.position += meters
}

func (m *Mallard) Quack() string {
    return "quack!"
}

type Muscovy struct {
    bornAt int
    position int
}

func (m *Muscovy) Walk(meters int) {
    m.position += meters
}

func (m *Muscovy) Quack() string {
    return "quack!"
}


Use Cases

Any object that implements the receiver methods Walk() and Quack() is, for purposes of typing, a Duck.

// As a struct member.
type Coop struct {
    ducks []Duck
}

func (c *Coop) HatchNew(species string) {
    if species == "mallard" {
        c.ducks = append(c.ducks, Mallard{0})
    } else {
        c.ducks = append(c.ducks, Muscovy{0})
    }
}

// As a function argument.
func Report(duck Duck) {
    fmt.Printf("I have walked %d meters", duck.position)
}


Invalid Uses

Note that something like the following is forbidden.

func (d Duck) Greet() {
    println("quack!")
}

Interfaces cannot be a receiver type.


CategoryRicottone CategoryRicottone

Go/Interfaces (last edited 2024-03-17 15:12:51 by DominicRicottone)