当前位置: 首页 > 后端技术 > Python

16、理解Go语言面向对象编程:接口与多态

时间:2023-03-25 23:00:11 Python

大家好,我是明哥。自学Golang的那段时间,我写了详细的学习笔记,放在了我的个人微信上公众号《Go编程时光》。我也是Go语言的初学者,所以我写的应该更适合刚入门的人。如果你刚开始学习Go语言,不妨关注一下,一起学习成长。我的在线博客:http://golang.iswbm.com我的Github:github.com/iswbm/GolangCodingTime0。什么是界面?本段摘自Go语言中文网。在面向对象领域,接口一般是这样定义的:一个接口定义了一个对象的行为。接口只指定对象应该做什么。至于如何实现这种行为(即实现细节),则由对象自己来决定。在Go语言中,接口是方法签名(MethodSignature)的集合。当一个类型定义了接口中的所有方法时,我们说它实现了该接口。这与面向对象编程(OOP)所说的非常相似。接口指定类型应该具有的方法,并且由类型决定如何实现这些方法。1.如何定义一个接口使用type关键字来定义一个接口。下面的代码定义了一个电话接口,该接口要求必须实现call方法。typePhoneinterface{call()}2.如何实现一个接口如果有一个类型/结构实现了一个接口需要的所有方法,这里Phone接口只有call方法,所以只要call方法是implemented,我们可以称之为implementedPhone接口。就是说,如果有一台可以打电话给别人的机器,那我们就可以称它为电话。这个接口的实现是隐式的,不像在JAVA中使用implements来显示描述。继续上面的phone例子,我们先定义一个Nokia结构体,它实现了call方法,所以它也是一个phone。typeNokiastruct{namestring}//接受者是Nokiafunc(phoneNokia)call(){fmt.Println("IamNokia,aphone")}3.接口实现了多态鸭子类型(Ducktyping)的定义是,只要你长得像鸭子,叫起来像鸭子,那我就认为你是鸭子。举个通俗的例子,什么样的人才能称为老师?不同的人有不同的标准。有人认为必须有一定的学历,有人认为必须有教师资格证。而我认为,凡是能育人,能传授知识的人,都可以称为老师。不管你教什么科目?无论是运动还是教学烹饪。不管你怎么教?是在课堂上拿着教鞭粉笔,还是在实战中直接追求真理实践。无论。这就是同一界面(老师)下在不同对象(人)上的不同表现。这就是多态。在Go语言中,多态性是通过接口来实现的。下面是使用商品接口的代码演示。首先定义一个商品(Good)的接口,也就是一个类型或者结构,只要实现了settleAccount()和orderInfo()这两个方法,那么这个类型/结构就是一个商品。typeGoodinterface{settleAccount()intorderInfo()string}然后我们定义两个结构体,手机和礼物。typePhonestruct{namestringquantityintpriceint}typeFreeGiftstruct{namestringquantityintpriceint}分别为它们实现Good接口的两个方法//Phonefunc(phonePhone)settleAccount()int{returnphone.quantity*phone.price}func(phonePhone)orderInfo()string{return"你要购买"+strconv.Itoa(phone.quantity)+"unit"+phone.name+"count:"+strconv.Itoa(phone.settleAccount())+"yuan"}//FreeGiftfunc(giftFreeGift)settleAccount()int{return0}func(giftFreeGift)orderInfo()string{return"你要买"+strconv.Itoa(gift.quantity)+""+gift.name+"total:"+strconv.Itoa(gift.settleAccount())+"yuan"}实现Good接口需要的两个方法后,手机和礼物都是Go中的商品语言(好)打字了。至此,我选择了两个产品(实例化),分别是手机和耳机(赠品,不要钱)iPhone:=Phone{name:"iPhone",quantity:1,price:8000,}earphones:=FreeGift{name:"Headphones",quantity:1,price:200,}然后创建一个购物车(也就是Good类型的一片)来存放这些商品。goods:=[]Good{iPhone,earphones}最后定义一个计算购物车订单金额的方法funccalculateAllPrice(goods[]Good)int{varallPriceintfor_,good:=rangegoods{fmt.Println(good.orderInfo())allPrice+=good.settleAccount()}returnallPrice}完整代码贴在下面,供大家参考。packagemainimport("fmt""strconv")//定义一个接口typeGoodinterface{settleAccount()intorderInfo()string}typePhonestruct{namestringquantityintpriceint}func(phonePhone)settleAccount()int{returnphone.quantity*phone.price}func(phonePhone)orderInfo()string{return"您要购买"+strconv.Itoa(phone.quantity)+"个"+phone.name+"计:"+strconv.Itoa(phone.settleAccount())+"元"}typeFreeGiftstruct{namestringquantityintpriceint}func(giftFreeGift)settleAccount()int{return0}func(giftFreeGift)orderInfo()string{return"您要购买"+strconv.Itoa(gift.quantity)+"个"+gift.name+"计:"+strconv.Itoa(gift.settleAccount())+"元"}funccalculateAllPrice(goods[]Good)int{varallPriceintfor_,good:=rangegoods{fmt.Println(good.orderInfo())allPrice+=good.settleAccount()}returnallPrice}funcmain(){iPhone:=Phone{name:"iPhone",quantity:1,price:8000,}earphones:=FreeGift{name:"Earphone",quantity:1,price:200,}goods:=[]Good{iPhone,earphones}allPrice:=calculateAllPrice(商品)fmt.Printf("此订单共需支付%d元",allPrice)}运行后输出如下:你想买1部iPhone:8000元你想买1部耳机:0元这个订单共需支付8000元系列指南01.搭建开发环境(Goland&VSCode)02.学习变量创建的五种方法03.数据类型详解:整型和浮点型04.数据类型详解:byte,rune,string05.数据类型详解:数组和切片06.数据类型详解:字典和布尔类型07.数据类型详解:指针08.面向对象编程:结构和继承09.一篇看懂函数的文章Go10.Go语言流程控制:if-else条件语句11.Go语言流控:switch-case选择语句12.Go语言流控:for循环语句13.Go语言流控:goto无条件跳转14.Go语言流控:defer延迟调用15.面向对象编程:接口与多态16.关键词:make和new的区别?17.一篇理解Go中语句块和作用域的文章18.学习Go协程:goroutine19。学习Go协程:详解channel/channels20.channeldeadlock的几个经典错误案例详解21。学习Go协程:WaitGroup22。学习Go协程:互斥锁和读写锁23。Go中的异常处理:panic和recover24。超详细解读GoModules的前世今生GettingStarted25.Go语言包导入必学的八个知识点26.如何把自己的模块开源给别人使用?27.谈谈Go语言中的类型断言?28.这五点帮你理解Go语言的select用法