Идея интерфейсов go - это duck typing . Что просто означает: если вы похожи на утку и крякаете как утка, значит, вы утка. Это означает, что если ваш объект реализует все функции утки, то не должно быть проблем с использованием его в качестве утки. Вот пример:
package main
import (
"fmt"
)
type Walker interface {
Walk() string
}
type Human string
type Dog string
func (human Human) Walk() string { //A human is a walker
return "I'm a man and I walked!"
}
func (dog Dog) Walk() string { //A dog is a walker
return "I'm a dog and I walked!"
}
//Make a walker walk
func MakeWalk(w Walker) {
fmt.Println(w.Walk())
}
func main() {
var human Human
var dog Dog
MakeWalk(human)
MakeWalk(dog)
}
Здесь Human
- это Walker
, а Dog
- это Walker
. Зачем? Потому что они оба .. ну ... Walk
. Они оба реализуют функцию Walk () string
. Вот почему вы можете выполнить MakeWalk
для них.
Это очень полезно, когда вы хотите, чтобы разные типы вели себя одинаково. Практическим примером могут быть объекты типа файла (сокеты, файловые объекты) - вам нужны функции записи и чтения для всех из них. Тогда вы можете использовать «Писать и читать» одинаково, независимо от их типа, что здорово.