接口声明
Go语言的接口与上篇讲的结构体有点类似,同样使用type 关键字开始定义,接口的关键字是: interface, 是一个高度抽象的类型,可以使用它实现面对对象的特性,接口主要是定义一些方法名称,输入参数和返回类型的集合。通常用由结构体(sctuct)来声明方法并实现它们,定义两个接口的例子:
type Tester interface {
Say() //Say()是个方法,没有返回值
}
type Helloer interface {
Say() string /Say()是个方法,返回类型为string
}
接口的名字一般用er结尾,通俗规定,可以快速识别它是一个接口类型,只用接口里面只有方法的声明没有实现,并且不用func关键字。
接口实现及多态
任何类型只要实现的接口中定义的方法集合,那么这个接口就是属于这个类型。这些类型通常使用结构体(struct),又来举一个例子:
package main
import "fmt"
type Person interface { //定义一个接口
Run() // 跑
Walk() // 走
}
type Man struct { //定义一个Man的接口体,也是一个类型,用来实现接口,这个类也叫接口的实现类
name string
}
func (d Man) Run(){ //接口里定义的方法,下面用实现类来调用它
fmt.Println("在跑的人叫",d.name)
}
func (d Man) Walk(){
fmt.Println("在走的人叫",d.name)
}
func main() {
var p Person //定义一个接口类型的变量
p = Man{"哈哈"} //给接口类型的变量赋值,指定接口的实现类
p.Run() //调用接口实现类的方法 ,接口实现
p.Walk()
}
这个例子就是展现了面对对象种的多态,多态一般理解就是一种事务的多种形态,在上面的代码可以看出不管定义了什么类型的接口实现类都可以让这个实现这个Person的接口,让这个实现类有Run和Walk的方法(功能),例如再定义一个Dog实现类:
package main
import "fmt"
type Person interface { //定义一个接口
Run() // 跑
Walk() // 走
}
func (d Man) Run(){ //接口里定义的方法
fmt.Printf("在跑的狗%d岁了\n",d.age)
}
func (d Man) Walk(){
fmt.Printf("在走的狗%d岁了\n",d.age)
}
type Dog struct { //定义一个狗的结构体,结构体也是一个类型,下面用来实现接口
age int
}
func main() {
var p Person
p = Man{12}
p.Run()
p.Walk()
}
甚至可以扩大到任何定义的类型可以实现任何接口,这样是不是很好理解了。不同类型对接口里定义的方法的调用就是Go语言实现的类似面对对象这种编程思想中的多态。