Go语言基础之结构体(冬日篇)
回复“ Go语言 ”即可获赠从入门到进阶共10本电子书
今
日
鸡
汤
曲终收拨当心画,四弦一声如裂帛。前言
Hey,大家好呀,我是码农,星期八,这是最后一次了,同样也是Go面向对象的最后一次了。坚持住,一起看看看吧。
  
 
结构体继承
说起继承,学过Java,Python的肯定都不陌生,但是Go中,可没有这个东西呐。
那咋办呢???,还是得用结构体来实现。
假装我们都是男孩,喜欢车,那我们就拿车来举例子吧。
  
 
车结构体
//车type Car struct {Brand string //车品牌CarNum string //车牌号Tyre int //轮胎个数}
//给车绑定一个方法,说明车的基本信息func (this *Car) carInfo() {fmt.Printf("品牌:%s,车牌号:%s,轮胎个数:%d\n", this.Brand, this.CarNum, this.Tyre)}
 
 宝马车 
 
 //宝马车type BMWCar struct {//*Car和Car基本没有区别,一个存的是整个结构体,一个存的是结构体地址,用法大同小异*Car //这就表示继承了Car这个结构体}
 
 比亚迪车 
 
 //比亚迪车type BYDCar struct {*Car}
 可能看到这,你会有种熟悉得感觉,这不就是上节课所将的结构体嵌套吗??? 
这跟继承有毛关系?
其实在Go中,结构体既可以用来 存储数据 ,也可以 用来模仿对象 的各种操作。
main代码
func main() {//一个宝马对象var bmw1 = BMWCar{&Car{Brand: "宝马x8",CarNum: "京666",Tyre: 4,}}//一个比亚迪对象var byd1 = BYDCar{&Car{Brand: "比亚迪L3",CarNum: "京111",Tyre: 4,}}//因为 BMWCar 和 BYDCar 都继承了Car,所以都有carInfo这个方法bmw1.carInfo()byd1.carInfo()}
 执行结果 
 
  
 这就是一个最简单的,面向对象,跟其他语言一样,继承会将所有的属性和方法都继承过来。 
  
 
序列化
到此为止呢,结构体基本可以告一段落了,基本算是入门了,当然,并没有结束,但是我想大家都累了,换个方向继续玩。
这个东西叫做序列化,什么意思呢,就是像咱们的 切片 了, map 了, 结构体 了等,这些都是Go的类型。
如果要和其他语言交流,人家可没有这些玩意唉,那怎么办呢???
 众多大佬就形成了一个规范,  json  数据格式,  json  数据必须是  字符串类型  。 
 最外面是  '  号,键/值对组合中的键名写在前面并用双引号  ""  包裹。 
就像这样。
      
        '{"Gender":"男","Name":"张三"}'    //'说明这个是字符串,一般打印时不显示
      
     
  序列化我们用到的是  json  模块的  Marshal  方法。 
  
 
切片序列化
单独的切片序列化用的很少,但是仍然还是要知道。
示例代码
package main
import ("encoding/json""fmt")
type Student struct {Gender stringName string}
func main() {var StudentList = []string{"张三", "李四"}fmt.Printf("StudentList类型:%T\n", StudentList) //[]string,这是列表类型serializeByte, err := json.Marshal(StudentList)if err != nil {fmt.Println("序列化失败")return}var serializeStr = string(serializeByte)fmt.Printf("serializeStr类型:%T\n", serializeStr) //string,这是字符串类型fmt.Printf("serializeStr值:%v\n", serializeStr) //["张三","李四"]}
 第16行代码将切片序列化,但是返回的是  []byte  类型,第21行代码将  []byte  类型转成字符串。 
执行结果
 
 
 map序列化 
 
  字典序列化,就比较有味道了,序列化的是一个标准的  json  数据格式。 
示例代码
package main
import ("encoding/json""fmt")
type Student struct {Gender stringName string}
func main() {var StudentInfo = map[string]string{"Name":"张三","Age":"18","Gender":"男",}fmt.Printf("StudentInfo类型:%T\n",StudentInfo)serializeByte, err := json.Marshal(StudentInfo)if err != nil {fmt.Println("序列化失败")}var serializeStr = string(serializeByte)fmt.Printf("serializeStr类型:%T\n", serializeStr) //string,这是字符串类型fmt.Printf("serializeStr值:%v\n", serializeStr) //{"Age":"18","Gender":"男","Name":"张三"}}
 执行结果 
 
 这个就有点像标准的  json  格式了。 
  
 
结构体序列化
结构体代码
type Student struct {Name stringGender stringAge int}
 main 
 
 func main() {var s1 = Student{Name: "张三",Gender: "男",Age: 18,}fmt.Printf("StudentInfo类型:%T\n", s1)serializeByte, err := json.Marshal(s1)if err != nil {fmt.Println("序列化失败")}var serializeStr = string(serializeByte)fmt.Printf("serializeStr类型:%T\n", serializeStr) //string,这是字符串类型fmt.Printf("serializeStr值:%v\n", serializeStr)}
执行结果
 
 
 切片套结构体 
 
 一般情况下,这种方式数据格式是用的比较多的。
当然, 还可以切片嵌套map,方法和此方法一样,不做例子了。
示例代码
package main
import ("encoding/json""fmt")
type Student struct {Name stringGender stringAge int}
func main() {var s1 = Student{Name: "张三",Gender: "男",Age: 18,}var s2 = Student{Name: "李四",Gender: "女",Age: 16,}//一个存放 Student 的列表var studentList = []Student{s1, s2}fmt.Printf("StudentInfo类型:%T\n", studentList)serializeByte, err := json.Marshal(studentList) //main.Studentif err != nil {fmt.Println("序列化失败")}var serializeStr = string(serializeByte)fmt.Printf("serializeStr类型:%T\n", serializeStr) //string,这是字符串类型fmt.Printf("serializeStr值:%v\n", serializeStr)}
执行结果
 
 
 结构体标签(Tag) 
 
   Tag  可以理解为结构体的说明,由一对  反引号  包裹起来。 
但是一般情况下,Tag在序列化是用的比较多。
  
 
结构体代码
type Student struct {Name string `json:"name"`Gender string `json:"gender"`Age int `json:"age"`}
每个字段后面跟的,就是 Tag ,一定不要把格式搞错啦。
main代码
func main() {var s1 = Student{Name: "张三",Gender: "男",Age: 18,}fmt.Printf("StudentInfo类型:%T\n", s1)serializeByte, err := json.Marshal(s1) //main.Studentif err != nil {fmt.Println("序列化失败")}var serializeStr = string(serializeByte)fmt.Printf("serializeStr类型:%T\n", serializeStr) //string,这是字符串类型fmt.Printf("serializeStr值:%v\n", serializeStr)}
执行结果
 
 可以发现  key  成小写的了,这就说明一个问题。 
 在序列化时,如果  结构体  有  json  这个Tag,序列化时就会以  json  Tag为准,如果没有  json  Tag,则以  结构体字段为准  。 
  
 
总结
上述我们学习了Go基础之结构体的 结构体继承 , 序列化 , 结构体标签 。学完Go的结构体,可能你也知道了在Go中是如何模仿面向对象了。
一定记得多多实践,多多敲代码。如果在操作过程中有任何问题,记得下面讨论区留言,我们看到会第一时间解决问题。
我是码农星期八,如果觉得还不错,记得动手点赞一下哈。感谢你的观看。
------------------- End -------------------
往期精彩文章推荐:
 欢迎大家点赞,留言,转发,转载,感谢大家的相伴与支持
想加入Go学习群请在后台回复【 入群 】
万水千山总是情,点个【 在看 】行不行
/今日留言主题/
