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

Go面试官问我如何实现面向对象?

时间:2023-03-29 18:15:02 PHP

大家好,我是炸鱼。刚开始接触Go语言的时候,总会把其他语言的基本特性和Go语言进行比较。说白了,旧知识和新知识是相关的,才能达到更高的学习效率。最常见的类比是“Go语言是如何实现面向对象的?”进一步发展就是Go语言在面向对象的特性中是如何实现继承的。这个不仅用在学习上,在业界的Go面试中,很多面试官喜欢问:来自读者微信群,今天的文章中,建宇带大家详细了解这块知识。让我们一起愉快地开启熏鱼之路吧。什么是面向对象在了解Go语言是否面向对象(简称:OOP)之前,首先要知道OOP是什么,首先要对它进行“定义”。根据维基百科的定义,我们梳理了几个对OOP的基本认知:通常称为属性或属性),代码以程序(通常称为方法)的形式存在。一个对象自己的程序可以访问并经常修改它自己的数据字段。对象通常被定义为类的实例。对象利用属性和方法的私有/受保护/公共可见性,并且对象的内部状态不受外部影响(封装)。基于这些基本认知,进一步延伸出面向对象的三个基本特征:封装。继承。多态的。至此,面向对象的基本概念的讲解就结束了。如果想了解更多,可以自行上网。IsGoanobject-orientedlanguage“IstheGolanguageanobject-orientedlanguage?”,这是一个日经话题。官方FAQ给出的答案是:yesandno。原因:Go有类型和方法,并允许面向对象的编程风格,但没有类型层次结构。Go中的“接口”概念提供了一种我们认为易于使用且在某些方面更通用的不同方法。还有一些方法可以将类型嵌入到其他类型中,以提供类似但不等同于子类化的东西。Go中的方法比C++或Java中的方法更通用:它们可以为任何类型的数据定义,甚至是内置类型,如普通的“未装箱”整数。它们不限于结构(类)。Go由于缺乏类型层次结构,Go中的“对象”比C++或Java等语言更轻量级。Go实现面向对象编程封装面向对象中的“封装”是指能够隐藏对象的内部属性和实现细节,对外只提供公共接口调用,用户无需关注到你如何在内部实施它。Go语言中的属性访问权限是通过首字母大写来控制的:首字母大写表示它是公开的,可以被外部访问。第一个字母是小写的,表示它是私有的,不能被外部访问。Go语言中的一个例子如下:Animal)GetName()string{returnp.name}在上面的例子中,我们声明了一个结构体Animal,它的属性名是小写的。包上有Setter和Getter方法,用于统一访问和设置控制。这样就实现了Go语言中的基本封装。Inheritance面向对象中的“继承”是指子类继承父类的特性和行为,使子类对象(实例)具有父类的实例字段和方法,或者子类继承父类的方法类,使子类具有与父类相同的行为。图片来自网络。从实际例子来看,动物是一个大的父类,可以细分为“食草动物”和“食肉动物”。这两个将包含“动物”父类别的基本定义。在Go语言中,并没有类似于extends关键字的继承方式。语言设计采用组合方式:typeAnimalstruct{Namestring}typeCatstruct{AnimalFeatureAstring}typeDogstruct{AnimalFeatureBstring}在上面的例子中,我们声明了Cat和Dog结构体,它们在内部组合了Animal结构体匿名。因此,Cat和Dog实例都可以调用Animal结构体的方法:funcmain(){p:=NewAnimal()p.SetName("炸鱼,记得点赞~")dog:=Dog{Animal:*p}fmt.Println(dog.GetName())}Cat和Dog实例可以有自己的方法:func(dog*Dog)HelloWorld(){fmt.Println("Mybrainisfryingfish")}func(cat*Cat)HelloWorld(){fmt.Println("Friedfishisinthebrain")}上面的例子可以正常包含调用Animal的相关属性和方法,也可以有自己独立的属性和方法,实现类似继承Go语言效果。多态面向对象中的“多态性”是指同一行为能够有多种不同的表现形式或形式。具体来说,是指类实例(对象)的同一个方法在不同的情况下有不同的表现形式。多态性还允许内部结构不同的对象共享同一个外部接口,即一组外部模板,而内部实际上是什么,只要符合规范即可。在Go语言中,多态是通过接口实现的:AnimalSounder接口类型作为输入参数。所以在Go语言中。只要配套的Cat和Dog实例也实现了MakeSomeDNA方法,那么我们就可以认为他是AnimalSounder接口类型:c*Cat)MakeDNA(){fmt.Println("炸鱼是炸鱼")}func(c*Dog)MakeDNA(){fmt.Println("炸鱼不是炸鱼")}funcmain(){MakeSomeDNA(&Cat{})MakeSomeDNA(&Dog{})}当Cat和Dog的实例实现了AnimalSounder接口类型的约束时,就意味着满足了条件,它们在Go语言中是一回事。可以作为输入参数传入MakeSomeDNA方法,然后根据不同的实例实现多态行为。小结通过今天的文章,我们对面向对象的定义以及Go官方对面向对象的看法有了一个基本的了解。实现方法一一说明。在日常工作中,基本了解这些概念就足够了。如果是面试,可以重点关注“封装、继承、多态”三大特性和“单一职责原则(SRP)、开闭原则(OCP)、里氏替换原则(LSP)、依赖倒置原则”五原则(DIP),InterfaceSegregationPrinciple(ISP)”进行深入的理解和解释。上面提到的概念在描述之后解决。然后讲解它的具体实现和Go语言中使用的基本原理,相互结合讲解才能达到很好的效果。鼓励大家有什么问题欢迎在评论区反馈交流。最好的关系是相互成就。您的好评是炸鱼创作最大的动力。感谢您的支持。文章持续更新中,可微信搜索【脑补炸鱼】阅读,本文已收录在GitHubgithub.com/eddycjy/blog,欢迎Star提醒。请参阅Go是一种面向对象的语言吗?面向对象的三个基本特征,五个基本原则Go面向对象编程(译)