Go语言基础之结构体(冬日篇)

开发 后端
说起继承,学过Java,Python的肯定都不陌生,但是Go中,可没有这个东西呐。那咋办呢???,还是得用结构体来实现。

[[355148]]

 前言

Hey,大家好呀,我是码农,星期八,这是最后一次了,同样也是Go面向对象的最后一次了。坚持住,一起看看看吧。

结构体继承

说起继承,学过Java,Python的肯定都不陌生,但是Go中,可没有这个东西呐。

那咋办呢???,还是得用结构体来实现。

假装我们都是男孩,喜欢车,那我们就拿车来举例子吧。

车结构体

 

  1. //车 
  2. type Car struct { 
  3.     Brand  string //车品牌 
  4.     CarNum string //车牌号 
  5.     Tyre   int    //轮胎个数 
  6.  
  7. //给车绑定一个方法,说明车的基本信息 
  8. func (this *Car) carInfo() { 
  9.     fmt.Printf("品牌:%s,车牌号:%s,轮胎个数:%d\n", this.Brand, this.CarNum, this.Tyre) 

宝马车

//宝马车

 

  1. //宝马车 
  2. type BMWCar struct { 
  3.     //*Car和Car基本没有区别,一个存的是整个结构体,一个存的是结构体地址,用法大同小异 
  4.     *Car //这就表示继承了Car这个结构体 

比亚迪车

  1. //比亚迪车 
  2. type BYDCar struct { 
  3.     *Car 

可能看到这,你会有种熟悉得感觉,这不就是上节课所将的结构体嵌套吗???

这跟继承有毛关系?

其实在Go中,结构体既可以用来存储数据,也可以用来模仿对象的各种操作。

main代码

 

  1. func main() { 
  2.     //一个宝马对象 
  3.     var bmw1 = BMWCar{&Car{ 
  4.         Brand:  "宝马x8", 
  5.         CarNum: "京666", 
  6.         Tyre:   4, 
  7. }} 
  8.     //一个比亚迪对象 
  9.     var byd1 = BYDCar{&Car{ 
  10.         Brand:  "比亚迪L3", 
  11.         CarNum: "京111", 
  12.         Tyre:   4, 
  13. }} 
  14.     //因为 BMWCar 和 BYDCar 都继承了Car,所以都有carInfo这个方法 
  15.     bmw1.carInfo() 
  16.     byd1.carInfo() 

执行结果

这就是一个最简单的,面向对象,跟其他语言一样,继承会将所有的属性和方法都继承过来。

序列化

到此为止呢,结构体基本可以告一段落了,基本算是入门了,当然,并没有结束,但是我想大家都累了,换个方向继续玩。

这个东西叫做序列化,什么意思呢,就是像咱们的切片了,map了,结构体了等,这些都是Go的类型。

如果要和其他语言交流,人家可没有这些玩意唉,那怎么办呢???

众多大佬就形成了一个规范,json数据格式,json数据必须是字符串类型。

最外面是'号,键/值对组合中的键名写在前面并用双引号""包裹。

就像这样。

  1. '{"Gender":"男","Name":"张三"}'    //'说明这个是字符串,一般打印时不显示 

序列化我们用到的是json模块的Marshal方法。

切片序列化

单独的切片序列化用的很少,但是仍然还是要知道。

示例代码

 

  1. package main 
  2.  
  3. import ( 
  4.     "encoding/json" 
  5.     "fmt" 
  6.  
  7. type Student struct { 
  8.     Gender string 
  9.     Name   string 
  10.  
  11. func main() { 
  12.     var StudentList = []string{"张三", "李四"
  13.     fmt.Printf("StudentList类型:%T\n", StudentList) //[]string,这是列表类型 
  14.     serializeByte, err := json.Marshal(StudentList) 
  15.     if err != nil { 
  16.         fmt.Println("序列化失败"
  17.         return 
  18.     var serializeStr = string(serializeByte) 
  19.     fmt.Printf("serializeStr类型:%T\n", serializeStr) //string,这是字符串类型 
  20.     fmt.Printf("serializeStr值:%v\n", serializeStr) //["张三""李四"

第16行代码将切片序列化,但是返回的是[]byte类型,第21行代码将[]byte类型转成字符串。

执行结果

map序列化

字典序列化,就比较有味道了,序列化的是一个标准的json数据格式。

示例代码

 

  1. package main 
  2.  
  3. import ( 
  4.     "encoding/json" 
  5.     "fmt" 
  6.  
  7. type Student struct { 
  8.     Gender string 
  9.     Name   string 
  10.  
  11. func main() { 
  12.     var StudentInfo = map[string]string{ 
  13.         "Name":"张三", 
  14.         "Age":"18", 
  15.         "Gender":"男", 
  16.     fmt.Printf("StudentInfo类型:%T\n",StudentInfo) 
  17.     serializeByte, err := json.Marshal(StudentInfo) 
  18.     if err != nil { 
  19.         fmt.Println("序列化失败"
  20.     var serializeStr = string(serializeByte) 
  21.     fmt.Printf("serializeStr类型:%T\n", serializeStr) //string,这是字符串类型 
  22.     fmt.Printf("serializeStr值:%v\n", serializeStr) //{"Age":"18""Gender":"男""Name":"张三"

执行结果

这个就有点像标准的json格式了。

结构体序列化

结构体代码

 

  1. type Student struct { 
  2.     Name   string 
  3.     Gender string 
  4.     Age    int 

main

 

  1. func main() { 
  2.   var s1 = Student{ 
  3.     Name:   "张三", 
  4.     Gender: "男", 
  5.     Age:    18, 
  6.   } 
  7.   fmt.Printf("StudentInfo类型:%T\n", s1) 
  8.   serializeByte, err := json.Marshal(s1) 
  9.   if err != nil { 
  10.     fmt.Println("序列化失败"
  11.   } 
  12.   var serializeStr = string(serializeByte) 
  13.   fmt.Printf("serializeStr类型:%T\n", serializeStr) //string,这是字符串类型 
  14.   fmt.Printf("serializeStr值:%v\n", serializeStr) 

执行结果

切片套结构体

一般情况下,这种方式数据格式是用的比较多的。

当然, 还可以切片嵌套map,方法和此方法一样,不做例子了。

示例代码

 

  1. package main 
  2.  
  3. import ( 
  4.   "encoding/json" 
  5.   "fmt" 
  6.  
  7. type Student struct { 
  8.   Name   string 
  9.   Gender string 
  10.   Age    int 
  11.  
  12. func main() { 
  13.   var s1 = Student{ 
  14.     Name:   "张三", 
  15.     Gender: "男", 
  16.     Age:    18, 
  17.   } 
  18.   var s2 = Student{ 
  19.     Name:   "李四", 
  20.     Gender: "女", 
  21.     Age:    16, 
  22.   } 
  23.   //一个存放 Student 的列表 
  24.   var studentList = []Student{s1, s2} 
  25.   fmt.Printf("StudentInfo类型:%T\n", studentList) 
  26.   serializeByte, err := json.Marshal(studentList) //main.Student 
  27.   if err != nil { 
  28.     fmt.Println("序列化失败"
  29.   } 
  30.   var serializeStr = string(serializeByte) 
  31.   fmt.Printf("serializeStr类型:%T\n", serializeStr) //string,这是字符串类型 
  32.   fmt.Printf("serializeStr值:%v\n", serializeStr)   

执行结果

结构体标签(Tag)

Tag可以理解为结构体的说明,由一对反引号包裹起来。

但是一般情况下,Tag在序列化是用的比较多。

结构体代码

 

  1. type Student struct { 
  2.   Name   string `json:"name"
  3.   Gender string `json:"gender"
  4.   Age    int    `json:"age"

每个字段后面跟的,就是Tag,一定不要把格式搞错啦。

main代码

 

  1. func main() { 
  2.   var s1 = Student{ 
  3.     Name:   "张三", 
  4.     Gender: "男", 
  5.     Age:    18, 
  6.   } 
  7.   fmt.Printf("StudentInfo类型:%T\n", s1) 
  8.   serializeByte, err := json.Marshal(s1) //main.Student 
  9.   if err != nil { 
  10.     fmt.Println("序列化失败"
  11.   } 
  12.   var serializeStr = string(serializeByte) 
  13.   fmt.Printf("serializeStr类型:%T\n", serializeStr) //string,这是字符串类型 
  14.   fmt.Printf("serializeStr值:%v\n", serializeStr)   

执行结果

可以发现key成小写的了,这就说明一个问题。

在序列化时,如果结构体有json这个Tag,序列化时就会以jsonTag为准,如果没有jsonTag,则以结构体字段为准。

总结

上述我们学习了Go基础之结构体的结构体继承,序列化,结构体标签。学完Go的结构体,可能你也知道了在Go中是如何模仿面向对象了。

一定记得多多实践,多多敲代码。如果在操作过程中有任何问题,记得下面讨论区留言,我们看到会第一时间解决问题。

我是码农星期八,如果觉得还不错,记得动手点赞一下哈。感谢你的观看。

本文转载自微信公众号「Go语言进阶学习」,可以通过以下二维码关注。转载本文请联系Go语言进阶学习公众号。

 

责任编辑:武晓燕 来源: Go语言进阶学习
相关推荐

2020-11-30 06:17:03

Go语言

2020-11-26 06:40:24

Go语言基础

2020-11-23 08:54:14

Go语言结构体

2020-12-20 09:59:13

Go语言基础技术

2020-12-02 09:10:22

Go结构数据类型

2023-07-29 15:03:29

2021-04-20 09:00:48

Go 语言结构体type

2020-12-16 08:07:28

语言基础反射

2020-11-05 09:58:16

Go语言Map

2020-12-23 08:39:11

Go语言基础技术

2022-02-16 10:03:06

对象接口代码

2020-10-22 08:33:22

Go语言

2020-11-11 10:52:54

Go语言C语言

2021-06-09 09:06:52

Go语言算法

2021-02-06 18:19:54

TimeGo语言

2021-02-20 10:06:14

语言文件操作

2020-12-09 09:59:32

Go语言技术

2020-10-25 07:33:13

Go语言

2022-04-27 10:01:43

切片Go封装

2020-10-23 08:38:19

Go语言
点赞
收藏

51CTO技术栈公众号