Duck typing
We have been basically doing what is called duck typing. Duck typing is a test in computer programming: If it looks like a duck, swims like a duck, and quacks like a duck, then it must be a duck. If a type matches an interface, then you can use that type wherever that interface is used. Duck typing is matching a type based upon methods, rather than the expected type:
type Speaker interface {
Speak() string
} Anything that matches the Speak() method can be a Speaker{} interface. When implementing an interface, we are essentially conforming to that interface by having the required method sets:
package main
import (
"fmt"
)
type Speaker interface {
Speak() string
}
type cat struct {
}
func main() {
c := cat{}
fmt.Println(c.Speak())
}
func (c cat) Speak() string {
return "Purr Meow"
} cat matches the Speak() method of the Speaker{} interface, so a cat is a Speaker{}:
package...