在Golang中,我们将结构体与接收器方法结合使用。到这里为止一切都很完美。
我不确定什么是接口。我们在结构中定义方法,如果要在结构上实现方法,则无论如何都要在另一个结构下再次编写该方法。
这意味着接口似乎只是方法定义,仅占用了页面上多余的空间。
有没有解释我为什么需要接口的示例?
回答:
接口太大了,不能在这里给出全面的答案,但是有些事情需要弄清楚它们的用途。
接口是一种 工具
。是否使用它们取决于您自己,但是它们可以使代码更清晰,更短,更易读,并且它们可以在程序包,客户端(用户)和服务器(提供者)之间提供良好的API。
struct
type Cat struct{}func (c Cat) Say() string { return "meow" }
type Dog struct{}
func (d Dog) Say() string { return "woof" }
func main() {
c := Cat{}
fmt.Println("Cat says:", c.Say())
d := Dog{}
fmt.Println("Dog says:", d.Say())
}
CatDog
interface{}Say()interface{}
Say()
type Sayer interface { Say() string
}
接口仅包含方法的 签名 ,而不包含方法的 实现 。
请注意,在Go语言中,如果类型的方法集是该接口的超集,则该类型 隐式
CatDogSayer
接口指定行为 。实现接口的类型意味着该类型具有接口“规定”的所有方法。
SayerSayer
animals := []Sayer{c, d}for _, a := range animals {
fmt.Println(reflect.TypeOf(a).Name(), "says:", a.Say())
}
(这反映出部分只是为了获得类型名称,到目前为止还不多。)
CatDogSay()CatDog
type Horse struct{}func (h Horse) Say() string { return "neigh" }
animals = append(animals, Horse{})
for _, a := range animals {
fmt.Println(reflect.TypeOf(a).Name(), "says:", a.Say())
}
假设您要编写其他适用于这些类型的代码。辅助功能:
func MakeCatTalk(c Cat) { fmt.Println("Cat says:", c.Say())
}
Cat
interface{}
解决方案?是的,界面。只需声明该函数以采用接口类型的值即可,该接口类型定义了您要对其执行的操作,仅此而已:
func MakeTalk(s Sayer) { fmt.Println(reflect.TypeOf(s).Name(), "says:", s.Say())
}
CatDogHorseSay()
在Go Playground上尝试这些示例。
以上是 为什么在Golang中需要接口?的全部内容,