接口
Go语言基础之接口 - 李文周的博客
同其他语言一样,接口定义的是一种对象的行为规范,而不对内容进行具体的实现
而由实现了该接口的类去对行为进行实现
接口是由程序员来定义的类型,一个接口类型就是一组方法的集合,规定了需要实现的所有方法
接口类型
接口的定义
每个接口类型由一系列方法签名组成,基本格式如下所示:
type 接口类型名 interface{
方法名1( 参数列表1 ) 返回值列表1
方法名2( 参数列表2 ) 返回值列表2
…
}
实现接口的条件
接口就是规定了一个需要实现的方法列表 在Go语言中,只要实现了接口中规定的所有方法,那么我们就称它实现了这个接口
为什么要使用接口
在现实世界中,很多动物都会发出叫声(比如猫、狗、老虎等等),尽管他们发出的叫声不相同,但是有时候我们并不关心他们具体的叫声,而是他们的叫的这种行为
因此我们将这个行为抽象出来,成为接口
然后猫、狗、老虎等动物只需要实现这个接口中的方法即可
接口类型变量
那实现了接口又有什么用呢?一个接口类型的变量能够存储所有实现了该接口的类型变量。 例如在上面的示例中,Dog和Cat类型均实现了Sayer接口,此时一个Sayer类型的变量就能够接收Cat和Dog类型的变量。
var x Sayer // 声明一个Sayer类型的变量x
a := Cat{} // 声明一个Cat类型变量a
b := Dog{} // 声明一个Dog类型变量b
x = a // 可以把Cat类型变量直接赋值给x
x.Say() // 喵喵喵
x = b // 可以把Dog类型变量直接赋值给x
x.Say() // 汪汪汪
类型与接口的关系
一个类型实现多个接口
比如Dog
这个类型,可以同时实现Sayer
和Mover
这两个接口
多种类型实现同一接口
不同的类型也可以实现同一个接口,比如狗会动,汽车也会动,因此我们使用如下代码体现上述关系:
// 实现Mover接口
func (d Dog) Move() {
fmt.Printf("%s会动\n", d.Name)
}
// Car 汽车结构体类型
type Car struct {
Brand string
}
// Move Car类型实现Mover接口
func (c Car) Move() {
fmt.Printf("%s速度70迈\n", c.Brand)
}
空接口
空接口的定义
空接口是没有定义任何方法的接口类型。
因此任何类型都可以认为是实现了空接口
从而空接口可以存储任何类型的值
空接口的应用
- 可以作为函数的参数
- 作为map字典值的类型,从而保存任意类型的数据