在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中需要接口?的全部内容,