Go: Interface (example)

An Interface in Go defines a behavior. Interfaces are defined with a number of methods that a type must implement. Once the methods are implemented, the type can be used wherever the interface type is needed.

Let’s for example define a Phone interface:

type Phone interface {
	Call()
}

We also define a Nokia type that implements the Phone interface. We simply need to implement the Call() function to implement the Phone interface. Languages such as Java or C# need an explicit statement that they are implementing the interface: public class Nokia implements Phone { }. In Go you just need to implement the functions:

type Nokia struct {
    //...
}

func (n Nokia) Call() {
    fmt.Println("Calling someone with my Nokia")
}

Besides the Nokia we also want an Iphone:

type Iphone struct {
    //...
}

func (n Iphone) Call() {
    fmt.Println("Calling someone with my iPhone")
}

Now we define a more generic UseMyPhone function that will use the Phone interface:

func UseMyPhone(p Phone) {
    p.Call()
}

This allows us to call the UseMyPhone function with any Phone type:

n := Nokia{}
i := Iphone{}

UseMyPhone(n)
UseMyPhone(i)

Go Playground

The ability to implement interfaces by just implementing the needed functions is called duck-typing (i.e. signature based polymorphism).