一、接口
- 接口是一种类型(用type关键字来定义)
- 接口(interface)定义了一个对象的行为规范,只定义规范不实现,由具体的对象来实现规范的细节。
- 接口限制了结构体必须实现的方法
1、接口类型
- 在Go语言中接口(interface)是一种类型,一种抽象的类型。
- interface 是一组 method 的集合,是 duck-type programming 的一种体现。接口做的事情就像是定义一个协议(规则),只要一台机器有洗衣服和甩干的功能,我就称它为洗衣机。不关心属性(数据),只关心行为(方法)。
2、为什么要使用接口
type Cat struct{
}
func (c Cat) Say() string {
return "喵喵喵" }
type Dog struct{
}
func (d Dog) Say() string {
return "汪汪汪" }
func main() {
c := Cat{
}
fmt.Println("猫:", c.Say())
d := Dog{
}
fmt.Println("狗:", d.Say())
}
3、接口的定义
- Go语言提倡面向接口编程。
- 接口定义格式:
type 接口名 interface{
方法1(参数1,参数2···)(返回值1,返回值2···)
方法2(参数1,参数2···)(返回值1,返回值2···)
····
}
# 接口名:使用type将接口定义为自定义的类型名。Go语言的接口在命名时,一般会在单词后面添加er,如有写操作的接口叫Writer,有字符串功能的接口叫Stringer等。接口名最好要能突出该接口的类型含义。
# 方法名:当方法名首字母是大写且这个接口类型名首字母也是大写时,这个方法可以被接口所在的包(package)之外的代码访问。
# 参数列表、返回值列表:参数列表和返回值列表中的参数变量名可以省略。
示例:Write方法的接口名,我们通常可以定义为Writer
type writer interface{
Write([]byte) error
}
4、实现接口的条件
- 一个变量如果实现了接口中规定的所有方法,那么这个变量就实现了这个接口,可以称为这个接口类型的变量(即调用这个变量,可以定义为接口类型)
- 要想实现接口,一定要满足接口中所有的方法并且要满足定义的方法格式
示例:
type spake interface {
spake()
}
// 定义的 hit 函数
func hit(animal spake) {
animal.spake()
}
// 定义一个dog结构体
type dog struct {
name string
}
// 定义一个cat结构体
type cat struct {
name string
}
// dog实现了spake接口
func (d dog) spake() {
fmt.Printf("%s 汪汪汪~\n", d.name)
}
// cat实现了spake接口
func (c cat) spake() {
fmt.Printf("%s 喵喵喵~\n", c.name)
}
func main() {
var d1 dog
var c1 cat
var s1 spake
s1 = d1 // 可以将满足接口中所有方法的结构体实例赋值给接口类型的变量
hit(s1)
var s2 spake
s2 = c1
hit(s2)
}
示例2:
type animal interface {
move()
eat(string)
}
type cat