接口interface

140 阅读1分钟

接口的概念

接口是一种类型,一种抽象的类型。我的理解是:如果把结构体或者其他数据类型看成是描述某些事物的特征,那么接口就是描述某些事物的行为,注重事物具有哪些功能。

接口的解释

先来看下面的一段代码

// 定义bird和people结构体
type bird struct {
   name string
}
type people struct {
   name string
}
// singer接口
type singer interface {
   sing()
}
// 为bird创建方法
func (b bird) sing() {
   fmt.Println("鸟唱歌真好听")
}
// 为people创建方法
func (p people) sing() {
   fmt.Println("人唱歌真好听")
}

// 接口作为参数传入singsong函数
func singsong(s singer) {
   s.sing()
}

func main() {
   var b bird
   var p people
   // bird和people都实现了sing方法,可以看成是singer接口类型,就可以当作参数传进去了
   singsong(b)
   singsong(p)
}

首先定义了两个结构体用来描述鸟和人的基本特征,但他们都有共同的行为:唱歌,用接口定义了singer来描述这一行为,具有sing这一行为的就可以看作是这个接口类型,后面为bird和people分别创造了sing方法就说明他们具有这一行为,那么他们就可以看作是singer接口类型,可以当作singsong这一函数的参数。

空接口

空接口是指没有定义任何方法的接口类型。因此任何类型都可以视为实现了空接口。也正是因为空接口类型的这个特性,空接口类型的变量可以存储任意类型的值。 也就是说当一个函数的参数是空接口类型时,你可以传任何类型的参数进去