前言大家好,我是码农,我之前是怎么学习面向对象的知识的,但是还是差了点接口。而且接口在代码中用的还是很多的,一起来看看吧!什么是接口?这里的接口不是指那种插槽的接口。在各种语言中,当提到一个接口时,通常是指一个规范,然后具体的对象实现这个规范的细节。本文使用的接口主要是约束接口,还有存储接口。注意:在Go中,接口是一种类型,一种只有方法没有属性的抽象类型。为什么我们需要接口?我们在讲结构体的时候,Go语言基础结构体(春季篇)、Go语言基础结构体(夏季篇)、Go语言基础结构体(秋季篇)都提到了继承。概念,Go通过结构体实现继承。查看继承的car结构体//cartypeCarstruct{Brandstring//汽车品牌CarNumstring//车牌号Tireint//轮胎数量}//给car绑定一个方法,说明carfunc的基本信息(this*Car)carInfo(){fmt.Printf("品牌:%s,车牌号:%s,轮胎数量:%d\n",this.Brand,this.CarNum,this.Tyre)}是四个汽车结构属性,以及一个显示carInfo信息的方法。BMWcar//BMWcartypeBMWCarstruct{//*Car和Car基本没有区别,一个存放整个结构体,一个存放结构体的地址,用法类似*Car//这个意思是Car结构继承body}BYDcar//BYDcartypeBYDCarstruct{*Car}maincodefuncmain(){//一个BMW对象varbmw1=BMWCar{&Car{Brand:"BMWx8",CarNum:"Beijing666",Tire:4,}}//一个BYD对象varbyd1=BYDCar{&Car{Brand:"BYDL3",CarNum:"京111",Tire:4,}}//因为BMWCar和BYDCar都继承了Car,他们都有carInfo方法bmw1.carInfo()byd1.carInfo()}执行结果通过回顾,我们可以发现car应该算是一个基本的概念。上面的Car结构体,好像是展示了汽车的属性,其实不太对。汽车是一个抽象的概念。电瓶车是车,车也是车,大货车也是车。这些车至少有一个统一的功能,就是跑,但是有几个轮胎什么牌子的。应该是属于自己的,已经不属于Car这个抽象概念了,这时候还是用接口比较好。定义接口carinterfacetypeCarinterface{//小车会跑Run(speedint)//小车需要加油Refuel(oilint)//小车需要转Wheel(directionstring)}假设小车至少有这三个动作,不管是什么结构,只要它实现了Car中的所有方法,就说明它一定是一辆汽车。BMWcar//BMW汽车类型BMWCarstruct{Ownerstring//车主Brandstring//汽车品牌CarNumstring//车牌号}//构造方法funcNewBMWCar(ownerstring,brandstring,carNumstring)*BMWCar{return&BMWCar{Owner:owner,Brand:brand,CarNum:carNum}}func(this*BMWCar)Run(speedint){fmt.Printf("我是%s,我的车是%s,我的车牌号是%s,myDrivingat%dspeed\n",this.Owner,this.Brand,this.CarNum,speed)}func(this*BMWCar)Refuel(oilint){fmt.Printf("老板,加%d升油oil\n",oil)}func(this*BMWCar)Wheel(directionstring){fmt.Printf("Iamturningat%s\n",direction)}batterycar//电池车类型Electromobilestruct{Ownerstring//ownerBrandstring//汽车品牌}funcNewElectromobile(ownerstring,brandstring)*Electromobile{return&Electromobile{Owner:owner,Brand:brand}}func(this*Electromobile)Run(speedint){fmt.Printf("Iam%s,mycaris%s,Iaredrivingat%dspeed\n",this.Owner,this.Brand,,speed)}func(this*Electromobile)Refuel(oilint){fmt.Printf("你妹是的,你给你的电动车加什么油.??..\n")}func(this*Electromobile)Wheel(directionstring){fmt.Printf("Iamturningat%s\n",direction)}这里有个区别,电瓶车没有属性CarNum,但是仍然实现了Car接口的所有方法,所以电瓶车在代码里,还是车mainfuncmain(){var张三的车Car张三的车=NewBMWCar("张三","宝马6","北京666")张三的车.Run(80)张三的车。Refuel(20)张三的车.Wheel("Left")var李四的车Car李四的车=NewElectromobile("李四","刀电动车")李四的车.Run(40)李四的Car.Refuel(0)Lisi的car.Wheel("Left")}第2行和第8行的代码,变量类型是Car接口类型,但赋值时确实是另外一种类型。Go是一种强类型语言。为什么类型不一致还能赋值?执行结果会不会有问题???执行结果但是我们发现执行结果是没有问题的。但是为什么变量类型不一致,还能赋值,每次都报错?我们上面的代码可以确认宝马车和电瓶车已经完全实现了Car接口中的所有方法。所以可以理解为Car就是他们的父亲,用父亲来接儿子当然是可以的。一个结构体实现多个接口下面的代码没有实际意义,纯属语法对语法。接口代码//运行接口类型Runer接口{Run()}//跳转接口类型Jumper接口{Jump()}结构代码//袋鼠结构类型Roostruct{Namestring}func(this*Roo)Jump(){fmt.Println("我是袋鼠,我会跳")}func(this*Roo)Run(){fmt.Println("我是袋鼠,我会跑")}这个结构体同时实现了两个结构体,一个是Runer,另一个是Jumper。maincodefuncmain(){varrunnerRunervarjumperJumperrunner=&Roo{Name:"Kangaroo"}jumper=&Roo{Name:"Kangaroo"}runner.Run()jumper.Jump()}Roo实现了两个接口,自然这两个接口都可以接收Roo结构。执行结果界面嵌套界面嵌套有点像组合,比如跑、跳、吃等操作。比如一个动物应该有这些操作,那么这个动物也应该是一个接口。并采取所有这些行动。接口示例代码//Run接口类型Runer接口{Run()}//Jump接口类型Jumper接口{Jump()}//Animal接口,继承跑跳类型Animal接口{RunerJumper}结构代码//KangarooA实现跑跳的结构体typeRoostruct{Namestring}func(this*Roo)Jump(){fmt.Println("我是袋鼠,我会跳")}func(this*Roo)Run(){fmt.Println("Iamakangaroo,Icanrun")}maincodefuncmain(){varanimalAnimalanimal=&Roo{Name:"kangaroo"}animal=&Roo{Name:"kangaroo"}animal.Run()Animal.Jump()}执行结果总结以上我们学习了Go的基本接口,主要是接口和继承的区别,一个结构实现多个接口,接口是嵌套的。可能不太好理解,但是一定要努力去做,一定要坚持!如果您在操作过程中有什么问题,记得在下方讨论区留言,我们看到会第一时间解决。本文转载自微信公众号《Go语言进阶学习》,可通过以下二维码关注。转载本文请联系Go语言进阶学习公众号。
