Duck typing in Go

Duck typing in Go

Today, did you know — a struct doesn’t have to implement an interface in Go. Go uses “duck typing”.

What is the duck typing?

If it looks like a duck, and it quacks like a duck, then it is a duck.

If it has a set of methods that match an interface, then you can use it wherever that interface is needed without explicitly defining that your types implement that interface.

Check out this interface:

// Speaker types can say things.
type Speaker interface {

Anything with a matching Say method can be called a Speaker.

We don’t do anything special to our struct types to satisfy this interface:

type Person struct {
  name string

func (p *Person) Say(message string) {
  log.Println(":", message)

Now assume we have a method that takes a Speaker:

func SpeakAlphabet(via Speaker) {

We can use our type look:

mat := new(Person) = "Mat"

And imagine if another package exists that provides this type:

type SpeakWriter struct {
  w io.Writer

func (s *SpeakWriter) Say(message string)
  io.WriteString(s.w, message)

We could use that too — without the other package even knowing about our interface.