2021-02-16

什么是接口?

我们在结构和方法课程中讨论了很多关于对象和行为的内容。 我们学习了结构体(以及其他非结构类型)实现方法。 接口是一组方法签名的集合,然后我们可以定义一个结构体实现该接口所有方法。因此,接口就是定义了对象的行为。

例如,结构体Dog可以walk和bark, 如果一个接口声明了walk和bark的方法签名,而Dog实现了walk和bark方法,那么Dog就实现了该接口。

接口的主要工作是仅提供由方法名称,输入参数和返回类型组成的方法签名集合。 由类型(例如struct结构体)来声明方法并实现它们。

如果您曾经是面向对象的程序员,您肯定会经常使用implements关键字来实现接口。 但是在go中,你没有明确提到一个类型是否实现了一个接口。 如果一个类型实现了在接口中定义的签名方法,则称该类型实现该接口。 就像说它像鸭子一样走路,像鸭子一样游泳,像鸭子一样嘎嘎叫,那就是鸭子。


定义接口

与struct类似,我们需要使用类型别名,通过interface关键字来简化接口声明。


type Shape interface {

    Area() float64

    Perimeter() float64

}

上面的代码中,我们定义了Shape接口,它有两个方法Area和Perimeter,他们不接收任何参数并返回float64。 任何实现这两个方法的类型我们都认为它实现了Shape接口。

由于interface也是一种类型,我们可以创建它的类型的变量。 在上面的例子中,我们可以创建一个类8型为接口Shape的变量s。

在我们对上面例子输出结果困惑前,让我解释一下。 接口有两种类型。 静态类型的接口是接口本身,例如上面的程序中的Shape。 接口没有静态值,而是指向动态值。 接口类型的变量可以保存实现接口的Type的值。 该类型的值成为接口的动态值,该类型成为接口的动态类型。

从上面的结果,我们可以看到接口的值是nil而且接口的类型也是nil。 这是因为此时,接口不知道是谁会实现它。 当我们使用带有接口参数的fmt包中的Println函数时,它指向接口的动态值,而Printf函数中的%T语法指的是接口的动态类型。 但实际上,接口的类型是Shape。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容