一篇文章带你了解Go语言基础之接口(上篇)
今
日三国史
鸡
汤
我从去年辞帝京,谪居卧病浔阳城。
前言
Hey,大家好呀,我是码农,星期八,之前怎么学到过面向对象的相关知识,但是还差一点,差了个接口。
并且接口在代码中用的还是比较多的,一起来看看吧!
什么是接口(interface)
quiet的反义词这里的接口,可不是说那种插槽的那种接口,互相怼到一块就完事了。
在各种语言中,提到接口,通常指的之一种规范,然后具体对象来实现这个规范的细节。
肌肉男的英文
本文使用的接口主要是约束接口,还有一种存储接口。
注:
演讲的艺术
在Go中,接口(interface)是一种类型,一种抽象类型,它只有方法,担保书格式没有属性。
为什么需要接口
我们在讲结构体时,Go语言基础之结构体(春日篇)、Go语言基础之结构体(夏日篇)、Go语言基础之结构体(秋日篇),提到过继承这个概念,Go是通过结构体来完成继承的。
回顾继承
车结构体
∙
∙
∙
∙
∙
∙
∙
∙
∙
∙
∙
//车type Car struct { Brand string //车品牌 CarNum string //车牌号 Tyre int //轮胎个数}
//给车绑定一个方法,说明车的基本信息func (this *Car) carInfo() { fmt.Printf("品牌:%s,车牌号:%s,轮胎个数:%d\n", this.Brand, this.CarNum, this.Tyre)}
车结构体有四个属性,同时还有一个显示车(carInfo)信息的方法。
宝马车
∙
∙
∙
∙
∙
/
/宝马车type BMWCar struct { //*Car和Car基本没有区别,一个存的是整个结构体,一个存的是结构体地址,用法大同小异 *Car //这就表示继承了Car这个结构体}
比亚迪车
∙
∙
∙
∙
//比亚迪车type BYDCar struct { *Car}
main代码
∙
∙
∙
∙
∙
∙
∙优秀简历模板
∙
∙
∙
∙
∙
∙
∙
∙
∙
∙
∙
∙
func main() { //一个宝马对象 var bmw1 = BMWCar{&Car{ Brand: "宝马x8", CarNum: "京666", Tyre: 4, }} //一个比亚迪对象 var byd1 = BYDCar{&Car{ Brand: "比亚迪L3", CarNum: "京111", Tyre: 4, }} //因为 BMWCar 和 BYDCar 都继承了Car,所以都有carInfo这个方法 bmw1.carInfo() byd1.carInfo()}
执行结果
通过回顾,我们可以发现,车,应该作为一个基本的概念。
上述Car结构体似乎显示了车的属性,其实是不太对的。
车就是一个抽象的概念,电瓶车是车,小轿车也是车,大卡车也是车。
这些车至少有一个统一的功能,那就是跑,但是像几个轮胎了,什么品牌了。
应该是属于自己的,不再是属于Car这个抽象的概念中了,所以,这时候用接口会更好。
定义接口
车接口
∙
∙
∙
∙
∙
∙
∙
∙
type Car interface { //车会跑 Run(speed int) //车需要加油 Refuel(oil int) //车需要转弯 Wheel(direction string)}
假设车,至少有这三个动作,不管任何结构体,只要实现了Car里面的所有方法,就代表它一定是一个车。
宝马车
∙
∙
∙
∙
∙
∙
∙
∙
∙
∙
∙
∙
∙
∙
∙
∙
∙
∙
∙
∙
∙
∙
//宝马车type BMWCar struct { Owner string //车主 Brand string //车品牌 CarNum string //车牌号}//构造方法func NewBMWCar(owner string, brand string, carNum string) *BMWCar { return &BMWCar{Owner: owner, Brand: brand, CarNum: carNum}}
func (this *BMWCar) Run(speed int) { fmt.Printf("我是 %s,我的车是 %s,我车牌号为 %s,我正在以 %d 速度行驶\n", this.Owner, this.Brand, this.CarNum, speed)}
func (this *BMWCar) Refuel(oil int) { fmt.Printf("老板,加%d升油\n", oil)}
func (this *BMWCar) Wheel(direction string维修英语) { fmt.Printf("我正在%s转弯\n", direction)}
痰中带血