01简介Golang语言是面向对象的语言吗?Golang语言的官方回答是Yes和No。这意味着什么?Golang语言是面向对象的语言,Golang语言不是面向对象的语言。Golang语言虽然有类(structs)和方法(methods),支持面向对象的编程风格,我们可以使用Golang语言的struct来实现面向对象的封装特性,但是Golang语言没有面向对象的继承特性,Golang语言可以使用组合实现“继承”。Golang语言中接口的实现也与其他语言不同。Golang语言中的接口实现方式是duck类型。封装、继承、多态是区分一种编程语言是否是面向对象编程语言的三个重要特征。在本文中,我们通过一些简单易懂的示例代码来介绍Golang语言的面向对象编程风格。02封装面向对象的封装特性,其他面向对象的语言都是使用class来定义一个类,然后在类中定义属性和方法。在Golang语言中,没有类的概念。它使用结构struct而不是类类。结构可以包含零个或多个变量,然后可以使用方法和结构绑定来实现方法来替换其他语言中的类。中的属性和方法。方法绑定的struct(receiver)是值类型和指针类型的区别。我们在上一篇文章中已经介绍过,这里不再赘述。typeEmployeestruct{NamestringGenderstringAgeuint8Salaryuint}func(eEmployee)Information()string{returnfmt.Sprintf("Name:%sGender:%sAge:%dSalary:%d",e.Name,e.Gender,e.Age,e.Salary)}阅读上面的代码,我们定义了一个名为Employee的结构体,其中包含4个成员变量,并定义了一个Information方法,该方法绑定到名为Employee的结构体上。03InheritanceCombination面向对象的继承特性在Golang语言中是不支持的,但是可以通过组合的方式实现“继承”。typeUserstruct{IDuint64NamestringScoreuint64}typeMemberstruct{UserLeveluint8}func(uUser)Information()string{returnfmt.Sprintf("ID:%dName:%sScore:%d",u.ID,u.Name,u.Score)}阅读以上内容一段代码,我们定义了一个名为User的struct,里面包含了3个成员变量,然后又定义了一个名为Member的struct,里面包含了2个成员变量,其中一个是内嵌的User,通过组合,Member类型“继承”了User类型的属性(成员变量)和方法。04PolymorphicGolang语言也有interface接口。它的接口实现方式是duck类型。它不需要像其他面向对象的编程语言那样使用关键字implements来显式声明,而只需要类型来实现接口中的所有功能。实现接口的方法。typeMemberRightsinterface{Information()string}typeBronzeMemberstruct{Discountuint8}typeSilverMemberstruct{Discountuint8}typeGoldMemberstruct{Discountuint8}func(b*BronzeMember)Information()string{returnfmt.Sprintf("折扣:%d",b.Discount)}函数(s*SilverMember)Information()string{returnfmt.Sprintf("Discount:%d",s.Discount)}func(g*GoldMember)Information()string{returnfmt.Sprintf("Discount:%d",g.Discount)}funcPrice(mMemberRights){fmt.Println(m.Information())}funcmain(){b:=&BronzeMember{Discount:9}Price(b)s:=&SilverMember{8}Price(s)g:=new(GoldMember)g.Discount=7Price(g)}看了上面的代码,我们定义了一个名为MemberRights的接口,其中包含了一个方法Information()string,然后又定义了三个struct分别命名为BronzeMember、SilverMember和GoldMember,并实现了Information()string方法。我们还定义了一个函数Price,它接受MemberRights接口类型的参数。我们在main函数中调用Price函数,传入我们定义的实现MemberRights接口中包含的方法Information()string的三个变量作为Price函数的参数。因为Price函数的参数是接口类型,所以我们需要传入一个指针类型的变量,我们还特意用三种不同的方式声明了指针类型的变量。05总结在这篇文章中,我们介绍了Golang语言是否是面向对象编程风格的语言,并给出了Golang语言的官方回答和解释。然后使用示例代码介绍了Golang语言的面向对象编程风格。需要注意的是,在Golang语言中,名字首字母的大小写是用来区分private和public的。私有和公共属性在Golang语言中也称为可导出和不可导出。本文转载自微信公众号《Golang语言开发栈》,可通过以下二维码关注。转载本文请联系Golang语言开发栈公众号。
