什么是接口?
我们在结构和方法课程中讨论了很多关于对象和行为的内容。 我们学习了结构体(以及其他非结构类型)实现方法。 接口是一组方法签名的集合,然后我们可以定义一个结构体实现该接口所有方法。因此,接口就是定义了对象的行为。
例如,结构体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。
网友评论