接口的概念
接口是一种类型,一种抽象的类型。我的理解是:如果把结构体或者其他数据类型看成是描述某些事物的特征,那么接口就是描述某些事物的行为,注重事物具有哪些功能。
接口的解释
先来看下面的一段代码
// 定义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这一函数的参数。
空接口
空接口是指没有定义任何方法的接口类型。因此任何类型都可以视为实现了空接口。也正是因为空接口类型的这个特性,空接口类型的变量可以存储任意类型的值。 也就是说当一个函数的参数是空接口类型时,你可以传任何类型的参数进去