当前位置: 首页 > 科技观察

一篇文章带你了解Go语言基础知识的接口(上)

时间:2023-03-18 01:17:37 科技观察

前言大家好,我是码农,周五,我之前是怎么学习面向对象的知识的,不过现在还是一个一点点,差不多是一个接口。而且接口在代码中用的还是很多的,一起来看看吧!什么是接口?这里的接口不是指那种插槽的接口。在各种语言中,当提到一个接口时,通常是指一个规范,然后具体的对象实现这个规范的细节。本文使用的接口主要是约束接口,还有存储接口。注意:在Go中,接口是一种类型,一种只有方法没有属性的抽象类型。为什么我们需要接口?我们在讲结构体的时候,Go语言基础结构体(春季篇)、Go语言基础结构体(夏季篇)、Go语言基础结构体(秋季篇)都提到了继承。概念,Go通过结构体实现继承。查看继承的汽车结构体//汽车类型Carstruct{Brandstring//汽车品牌CarNumstring//车牌号Tyreint//轮胎数量}//给汽车绑定一个方法,解释汽车的基本信息func(this*Car)carInfo(){fmt.Printf("品牌:%s,车牌号:%s,轮胎数量:%d\n",this.Brand,this.CarNum,this.Tyre)}car结构体有四个属性,并且有一个方法可以显示汽车(carInfo)信息。BMWcar//BMWcartypeBMWCarstruct{//*Car和Car基本相同,一个存储整个结构体,一个存储结构体的地址,用法类似*Car//这表示Car结构体是inherited}BYDcar//BYD汽车类型BYDCarstruct{*Car}主要代码funcmain(){//一个BMW对象varbmw1=BMWCar{&Car{Brand:"BMWx8",CarNum:"Beijing666",Tire:4,}}//一个BYD对象varbyd1=BYDCar{&Car{Brand:"BYDL3",CarNum:"Jing111",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//OwnerBrandstring//汽车品牌CarNumstring//车牌号}//构造方法funcNewBMWCar(ownerstring,brandstring,carNumstring)*BMWCar{return&BMWCar{Owner:owner,Brand:brand,CarNum:carNum}}func(this*BMWCar)Run(speedint){fmt.Printf("我是%s,我的车是%s,我的车牌号是%s,我以%d的速度行驶\n",this.Owner,this.Brand,this.CarNum,speed)}func(this*BMWCar)Refuel(oilint){fmt.Printf("老板,加%d升油\n",oil)}func(this*BMWCar)Wheel(directionstring){fmt.Printf("Iamturningat%s\n",direction)}电瓶车//电瓶车类型Electromobilestruct{Ownerstring//ownerBrandstring//carbrand}funcNewElectromobile(ownerstring,brandstring)*Electromobile{return&Electromobile{Owner:owner,Brand:brand}}func(this*Electromobile)Run(speedint){fmt.Printf(“我是%s,我的车是%s,我以%d的速度行驶\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接口的所有方法,所以电瓶车还是carmainfuncmain(){var张三的车Car张三的车=NewBMWCar("张三","宝马6","北京666")张三的车.Run(80)张三的车.Refuel(20)张三的车.Wheel("Left")var李四的车Car李四的车=NewElectromobile("李四","刀电动车")李Si'scar.Run(40)LiSi'scar.Refuel(0)LiSi'scar.Wheel("Left")}2、8行的代码,变量类型是CarInterface类型,但是赋值的时候,确实是另外一种类型.Go是一种强类型语言。为什么类型不一致还能赋值?执行结果会不会有问题???执行结果但是我们发现执行结果是没有问题的。但是为什么变量类型不一致,还能赋值,每次都报错?我们上面的代码可以确认宝马车和电瓶车已经完全实现了Car接口中的所有方法。所以可以理解为Car就是他们的父亲,用父亲来接儿子当然是可以的。一个结构体实现多个接口下面的代码没有实际意义,纯属语法对语法。接口代码//运行接口typeRunerinterface{Run()}//跳转接口typeJumperinterface{Jump()}结构代码//袋鼠结构typeRoostruct{Namestring}func(this*Roo)Jump(){fmt.Println("IIt'sa袋鼠,我会跳")}func(this*Roo)Run(){fmt.Println("我是袋鼠,我会跑")}这个结构体同时实现了两个结构体,一个是Runer,另一个是另一个是跳线。主要代码funcmain(){varrunnerRunervarjumperJumperrunner=&Roo{Name:"Kangaroo"}jumper=&Roo{Name:"Kangaroo"}runner.Run()jumper.Jump()}既然Roo实现了两个接口,自然两个接口的结构Roo可以收到。执行结果界面嵌套界面嵌套有点像组合,比如跑、跳、吃等操作。比如一个动物应该有这些操作,那么这个动物也应该是一个接口。并采取所有这些行动。界面示例代码//Run界面typeRunerinterface{Run()}//Jump界面typeJumperinterface{Jump()}//动物界面,继承跑跳typeAnimalinterface{RunerJumper}结构代码//袋鼠结构,实现跑跳JumptypeRoostruct{Namestring}func(this*Roo)Jump(){fmt.Println("我是一只袋鼠,我可以跳")}func(this*Roo)Run(){fmt.Println("我是一只袋鼠,我会运行")}主代码funcmain(){varanimalAnimalanimal=&Roo{Name:"kangaroo"}animal=&Roo{Name:"kangaroo"}animal.Run()animal.Jump()}上面我们学习Go的执行结果总结基本接口主要学习接口和继承的区别,一个结构体实现多个接口,接口是嵌套的。可能不太容易理解,但是一定要努力去做,坚持下去!