What is Interface?
Interface is used for abstraction. It contains one or more method signatures. Below is an example of how we define interface.
type Human interface {
speak()
}
Why we use interface?
In simple term interfaces are the contract for the methods for different structure type. To increase the code readability and maintenance we use interface. Let’s say there is Person datatype in my application and all the methods mentioned above actually implement the Person data type.
type Person struct {
First string
Last string
}
Now let’s say the method mentioned in the interface actually implement the Person struct
func (p Person) speak() {
fmt.Println("I am Person ", p.First)
}
Now the interesting part our software got a new requirement of adding another data type called SecretAgent.
type SecretAgent struct {
Person Person
Org string
}
Now we define another method speak() for the SecretAgent data type.
func (s SecretAgent) speak() {
fmt.Println("I am secret agent ", s.Person.First)
}
Now we can take the help of interface and the power of abstraction. We define a function that will take the interface and call the speak method.
func Earthling(h Human) {
fmt.Println("Hey there I am from planet Earth")
h.speak()
}
Understand what happened above? The Indian function take the human interface and call the speak method and we don’t have to specify for which data type the speak is going to work it will be managed by the go interfaces. So, it reduced a lot of hard coding and our design is future ready to accept more data type.
Let’s see the main function.
func main() {
sa1 := SecretAgent{
Person: Person{First: "James", Last: "Bond"},
Org: "MI6",
}
sa2 := SecretAgent{
Person: Person{First: "Ajit", Last: "Doval"},
Org: "RAW",
}
p1 := Person{First: "Dr.", Last: "Strange"}
Earthling(sa1)
Earthling(sa2)
Earthling(p1)
}