这是我参与「第三届青训营 -后端场」笔记创作活动的第1篇笔记
什么是接口
在JAVA编程语言中接口是一个抽象类型,是抽象方法的集合。go中也不例外,go吧具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口。
go接口的定义与使用
go语言使用interface关键字来定义接口,方式如下
type interface_name interface { //interface就表示这是一个接口
method_name1 [return_type] //接口里面定义的方法,返回值可有可无
method_name2 [return_type]
...
}
/* 定义结构体 */
type struct_name struct {
/* variables */
}
/* 实现接口方法 */
func (struct_name_variable struct_name) method_name1() [return_type] {
/* 方法实现 */
}
...
func (struct_name_variable struct_name) method_namen() [return_type] {
/* 方法实现*/
}
上面的结构体方法实现了接口里面的方法,就表示strucr_name实现了这个接口。这与java里面的接口有不小的差异,需要好好理解。
实例演示
type Phone interface { //定义一个电话接口
call() //电话都要有打电话的功能
}
type NokiaPhone struct { //诺基亚的电话实体
}
func (nokiaPhone NokiaPhone) call() { //诺基亚电话实现接口的call方法
fmt.Println("I am Nokia, I can call you!")
}
type IPhone struct { //苹果的电话实体
}
func (iPhone IPhone) call() { //苹果实现接口的call方法
fmt.Println("I am iPhone, I can call you!")
}
func main() { //测试类
var phone Phone
phone = new(NokiaPhone)
phone.call()
phone = new(IPhone)
phone.call()
}
结果:
I am Nokia, I can call you!
I am iPhone, I can call you!
思考: interface介绍 interface里面到底能存什么值呢?如果我们定义了一个interface的变量,那么这个变量里面可以存实现这个interface的任意类型的对象。例如上面例子中,我们定义了一个phone interface类型的变量phone,那么phone里面可以存NokiaPhone或者IPhone值
当然,使用指针的方式,也是可以的
但是,接口对象不能调用实现对象的属性
Go语言的多态性
Go中的多态性是在接口的帮助下实现的。正如我们已经讨论过的,接口可以在Go中隐式地实现。如果类型为接口中声明的所有方法提供了定义,则实现一个接口。让我们看看在接口的帮助下如何实现多态。
任何定义接口所有方法的类型都被称为隐式地实现该接口。
类型接口的变量可以保存实现接口的任何值。接口的这个属性用于实现Go中的多态性