前言大家好,我是码农,周五是最后一次,也是Go面向对象的最后一次。等等,一起来看看吧。结构继承说起继承想必Java和Python都不陌生,但Go中没有。那怎么办???,还是得用一个结构体来实现。假设我们都是男孩,都喜欢汽车,那么让我们以汽车为例。Carstructure//cartypeCarstruct{Brandstring//汽车品牌CarNumstring//车牌号Tyreint//轮胎数量}//绑定一个方法给汽车解释汽车的基本信息func(this*Car)carInfo(){fmt.Printf("品牌:%s,车牌号:%s,轮胎数量:%d\n",this.Brand,this.CarNum,this.Tyre)}BMW汽车//BMW汽车//BMWcartypeBMWCarstruct{//*Car和Car基本相同,一个存储整个结构体,一个存储结构体的地址,用法类似*Car//这表示继承Car结构体}BYDcar//BYDcartypeBYDCarstruct{*Car}你可能看到这个,会有一种熟悉的感觉。这不是上节课的结构嵌套吗???这跟继承有关系?其实在Go中,结构体可以用来存储数据,也可以用来模拟对象的各种操作。主代码funcmain(){//一个BMW对象varbmw1=BMWCar{&Car{Brand:"BMWx8",CarNum:"Beijing666",Tire:4,}}//一个BYD对象varbyd1=BYDCar{&Car{Brand:"BYDL3",CarNum:"Beijing111",Tire:4,}}//因为BMWCar和BYDCar都继承了Car,所以他们都有方法carInfobmw1.carInfo()byd1.carInfo()}执行结果ThisisOne最简单的,面向对象的,和其他语言一样,继承会继承所有的属性和方法。连载到这里就结束了,结构基本可以告一段落了,基本算是介绍了,当然还没有结束,不过我觉得大家都累了,还是换个方向继续玩吧。这个东西叫序列化,什么意思,就像我们的slice,map,structure等等,这些都是Go的类型。如果你想用其他语言交流,人家没有这些东西,怎么办???很多大佬形成了一个规范,json数据格式,json数据必须是string类型。最外层是标志,键/值对组合中的键名写在前面,用双引号“”括起来。像这样。'{"Gender":"Male","Name":"ZhangSan"}'//'表示这是一个字符串,打印时一般不显示序列号。我们使用json模块的Marshal方法。切片序列化很少使用单独的切片序列化,但仍然值得了解。示例代码packagemainimport("encoding/json""fmt")typeStudentstruct{GenderstringNamestring}funcmain(){varStudentList=[]string{"张三","李四"}fmt.Printf("StudentListtype:%T\n",StudentList)//[]string,这个是list类型serializeByte,err:=json.Marshal(StudentList)iferr!=nil{fmt.Println("Serializationfailed")return}varserializeStr=string(serializeByte)fmt.Printf("serializeStrtype:%T\n",serializeStr)//string,这是字符串类型fmt.Printf("serializeStrvalue:%v\n",serializeStr)//["张三","李四"]}第16行代码序列化切片,但返回[]byte类型,第21行代码将[]byte类型转为字符串。执行结果map序列化字典序列化比较有味道,序列化是标准的json数据格式。示例代码packagemainimport("encoding/json""fmt")typeStudentstruct{GenderstringNamestring}funcmain(){varStudentInfo=map[string]string{"姓名":"张三","年龄":"18","性别":"male",}fmt.Printf("StudentInfotype:%T\n",StudentInfo)serializeByte,err:=json.Marshal(StudentInfo)iferr!=nil{fmt.Println("序列化失败")}varserializeStr=字符串(serializeByte)fmt.Printf("serializeStrtype:%T\n",serializeStr)//string,这是字符串类型fmt.Printf("serializeStrvalue:%v\n",serializeStr)//{"Age":"18","Gender":"Male","Name":"张三"}}执行结果有点像标准的json格式。结构体序列化结构体代码typeStudentstruct{NamestringGenderstringAgeint}mainfuncmain(){vars1=Student{姓名:"张三",性别:"男",年龄:18,}fmt.Printf("StudentInfotype:%T\n",s1)serializeByte,err:=json.Marshal(s1)iferr!=nil{fmt.Println("序列化失败")}varserializeStr=string(serializeByte)fmt.Printf("serializeStrtype:%T\n",serializeStr)//string,这是一个字符串类型的fmt.Printf("serializeStrvalue:%v\n",serializeStr)}执行结果切片集合结构一般这种数据格式的方法用的比较多。当然嵌套map也可以切片,方法同本方法,这里不再举例。示例代码packagemainimport("encoding/json""fmt")typeStudentstruct{NamestringGenderstringAgeint}funcmain(){vars1=Student{姓名:"张三",性别:"男",年龄:18,}vars2=Student{姓名:"LiSi",Gender:"female",Age:16,}//存储的学生列表varstudentList=[]Student{s1,s2}fmt.Printf("StudentInfotype:%T\n",studentList)serializeByte,err:=json.Marshal(studentList)//main.Studentiferr!=nil{fmt.Println("序列化失败")}varserializeStr=string(serializeByte)fmt.Printf("serializeStrtype:%T\n",serializeStr)//string,这是一个字符串类型fmt.Printf("serializeStrvalue:%v\n",serializeStr)}执行结果结构体标签(Tag)Tag可以理解为结构的描述,由一对反引号包裹起来。但一般来说,Tag更多的用在序列化上。结构代码typeStudentstruct{Namestring`json:"name"`Genderstring`json:"gender"`Ageint`json:"age"`}后面是每个字段,也就是Tag,所以一定不要写错格式。主代码funcmain(){vars1=Student{姓名:"张三",性别:"男",年龄:18岁,}fmt.Printf("StudentInfo类型:%T\n",s1)serializeByte,err:=json.Marshal(s1)//main.Studentiferr!=nil{fmt.Println("序列化失败")}varserializeStr=string(serializeByte)fmt.Printf("serializeStrtype:%T\n",serializeStr)//string,这是字符串类型的fmt.Printf("serializeStrvalue:%v\n",serializeStr)}执行结果可以发现key是小写的,说明有问题。序列化时,如果结构体有json标签,则序列化时以jsonTag为准,如果没有jsonTag,则以结构体字段为准。综上所述,我们学习了Go基础结构体的结构体继承、序列化、结构体标签。学完Go的结构,你可能也知道如何模仿Go中的面向对象。一定要记得多练习,多敲代码。如果您在操作过程中有什么问题,记得在下方讨论区留言,我们看到会第一时间解决。周五我是码农,如果觉得还不错记得点个赞哦。感谢您的收看。本文转载自微信公众号《Go语言进阶学习》,可通过以下二维码关注。转载本文请联系Go语言进阶学习公众号。
