接口

Go语言基础之接口 - 李文周的博客
同其他语言一样,接口定义的是一种对象的行为规范,而不对内容进行具体的实现
而由实现了该接口的类去对行为进行实现
接口是由程序员来定义的类型,一个接口类型就是一组方法的集合,规定了需要实现的所有方法

接口类型

接口的定义

每个接口类型由一系列方法签名组成,基本格式如下所示:

  1. type 接口类型名 interface{
  2. 方法名1( 参数列表1 ) 返回值列表1
  3. 方法名2( 参数列表2 ) 返回值列表2
  4. }

实现接口的条件

接口就是规定了一个需要实现的方法列表 在Go语言中,只要实现了接口中规定的所有方法,那么我们就称它实现了这个接口

为什么要使用接口

在现实世界中,很多动物都会发出叫声(比如猫、狗、老虎等等),尽管他们发出的叫声不相同,但是有时候我们并不关心他们具体的叫声,而是他们的的这种行为
因此我们将这个行为抽象出来,成为接口
然后猫、狗、老虎等动物只需要实现这个接口中的方法即可

接口类型变量

那实现了接口又有什么用呢?一个接口类型的变量能够存储所有实现了该接口的类型变量。 例如在上面的示例中,Dog和Cat类型均实现了Sayer接口,此时一个Sayer类型的变量就能够接收Cat和Dog类型的变量。

  1. var x Sayer // 声明一个Sayer类型的变量x
  2. a := Cat{} // 声明一个Cat类型变量a
  3. b := Dog{} // 声明一个Dog类型变量b
  4. x = a // 可以把Cat类型变量直接赋值给x
  5. x.Say() // 喵喵喵
  6. x = b // 可以把Dog类型变量直接赋值给x
  7. x.Say() // 汪汪汪

类型与接口的关系

一个类型实现多个接口

比如Dog这个类型,可以同时实现SayerMover这两个接口

多种类型实现同一接口

不同的类型也可以实现同一个接口,比如狗会动,汽车也会动,因此我们使用如下代码体现上述关系:

  1. // 实现Mover接口
  2. func (d Dog) Move() {
  3. fmt.Printf("%s会动\n", d.Name)
  4. }
  5. // Car 汽车结构体类型
  6. type Car struct {
  7. Brand string
  8. }
  9. // Move Car类型实现Mover接口
  10. func (c Car) Move() {
  11. fmt.Printf("%s速度70迈\n", c.Brand)
  12. }

空接口

空接口的定义

空接口是没有定义任何方法的接口类型。
因此任何类型都可以认为是实现了空接口
从而空接口可以存储任何类型的值

空接口的应用

  • 可以作为函数的参数
  • 作为map字典值的类型,从而保存任意类型的数据