Я хотел бы понять тип интерфейса с простым примером его использования в Go (Language).
Я прочитал веб-документацию, но я не понимаю.
Я хотел бы понять тип интерфейса с простым примером его использования в Go (Language).
Я прочитал веб-документацию, но я не понимаю.
Идея интерфейсов go - утиная печать. Это просто означает: если вы выглядите как утка и шарлатан, как утка, то вы утка. Это означает, что если ваш объект реализует все функции утки, тогда не должно быть проблем с его использованием в качестве утки. Вот пример:
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)
}
Здесь a Human
является a Walker
, a Dog
является a Walker
. Зачем? Потому что они оба... ну... Walk
. Они оба реализуют функцию Walk () string
. Поэтому вы можете выполнить MakeWalk
на них.
Это очень полезно, если вы хотите, чтобы разные типы вели себя одинаково. Практическим примером могут быть объекты типа файла (сокеты, файловые объекты) - вам понадобятся функция Write и Read для всех из них. Затем вы можете использовать Write и Read в том же режиме, независимо от их типа - это классно.
Другой рабочий пример, показывающий взаимодействие между интерфейсом и структурой
package main
import "fmt"
type Info interface {
Noofchar() int
Increment()
}
type Testinfo struct {
noofchar int
}
func (x *Testinfo) Noofchar() int {
return x.noofchar
}
func (x *Testinfo) Increment() {
x.noofchar++
}
func main(){
var t Info = &Testinfo{noofchar:1}
fmt.Println("No of char ",t.Noofchar())
t.Increment()
fmt.Println("No of char ",t.Noofchar())
}