= 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 [[Go/ReceiverMethods|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 [[Go/ReceiverMethods|receiver type]]. ---- CategoryRicottone CategoryRicottone