自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Go語言基礎之結(jié)構(gòu)體(冬日篇)

開發(fā) 后端
說起繼承,學過Java,Python的肯定都不陌生,但是Go中,可沒有這個東西吶。那咋辦呢???,還是得用結(jié)構(gòu)體來實現(xiàn)。

[[355148]]

 前言

Hey,大家好呀,我是碼農(nóng),星期八,這是最后一次了,同樣也是Go面向?qū)ο蟮淖詈笠淮瘟?。堅持住,一起看看看吧?/p>

結(jié)構(gòu)體繼承

說起繼承,學過Java,Python的肯定都不陌生,但是Go中,可沒有這個東西吶。

那咋辦呢???,還是得用結(jié)構(gòu)體來實現(xiàn)。

假裝我們都是男孩,喜歡車,那我們就拿車來舉例子吧。

車結(jié)構(gòu)體

 

  1. //車 
  2. type Car struct { 
  3.     Brand  string //車品牌 
  4.     CarNum string //車牌號 
  5.     Tyre   int    //輪胎個數(shù) 
  6.  
  7. //給車綁定一個方法,說明車的基本信息 
  8. func (this *Car) carInfo() { 
  9.     fmt.Printf("品牌:%s,車牌號:%s,輪胎個數(shù):%d\n", this.Brand, this.CarNum, this.Tyre) 

寶馬車

//寶馬車

 

  1. //寶馬車 
  2. type BMWCar struct { 
  3.     //*Car和Car基本沒有區(qū)別,一個存的是整個結(jié)構(gòu)體,一個存的是結(jié)構(gòu)體地址,用法大同小異 
  4.     *Car //這就表示繼承了Car這個結(jié)構(gòu)體 

比亞迪車

  1. //比亞迪車 
  2. type BYDCar struct { 
  3.     *Car 

可能看到這,你會有種熟悉得感覺,這不就是上節(jié)課所將的結(jié)構(gòu)體嵌套嗎???

這跟繼承有毛關系?

其實在Go中,結(jié)構(gòu)體既可以用來存儲數(shù)據(jù),也可以用來模仿對象的各種操作。

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() 

執(zhí)行結(jié)果

這就是一個最簡單的,面向?qū)ο?,跟其他語言一樣,繼承會將所有的屬性和方法都繼承過來。

序列化

到此為止呢,結(jié)構(gòu)體基本可以告一段落了,基本算是入門了,當然,并沒有結(jié)束,但是我想大家都累了,換個方向繼續(xù)玩。

這個東西叫做序列化,什么意思呢,就是像咱們的切片了,map了,結(jié)構(gòu)體了等,這些都是Go的類型。

如果要和其他語言交流,人家可沒有這些玩意唉,那怎么辦呢???

眾多大佬就形成了一個規(guī)范,json數(shù)據(jù)格式,json數(shù)據(jù)必須是字符串類型。

最外面是'號,鍵/值對組合中的鍵名寫在前面并用雙引號""包裹。

就像這樣。

  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類型轉(zhuǎn)成字符串。

執(zhí)行結(jié)果

map序列化

字典序列化,就比較有味道了,序列化的是一個標準的json數(shù)據(jù)格式。

示例代碼

 

  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":"張三"

執(zhí)行結(jié)果

這個就有點像標準的json格式了。

結(jié)構(gòu)體序列化

結(jié)構(gòu)體代碼

 

  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) 

執(zhí)行結(jié)果

切片套結(jié)構(gòu)體

一般情況下,這種方式數(shù)據(jù)格式是用的比較多的。

當然, 還可以切片嵌套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)   

執(zhí)行結(jié)果

結(jié)構(gòu)體標簽(Tag)

Tag可以理解為結(jié)構(gòu)體的說明,由一對反引號包裹起來。

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

結(jié)構(gòu)體代碼

 

  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)   

執(zhí)行結(jié)果

可以發(fā)現(xiàn)key成小寫的了,這就說明一個問題。

在序列化時,如果結(jié)構(gòu)體有json這個Tag,序列化時就會以jsonTag為準,如果沒有jsonTag,則以結(jié)構(gòu)體字段為準。

總結(jié)

上述我們學習了Go基礎之結(jié)構(gòu)體的結(jié)構(gòu)體繼承,序列化,結(jié)構(gòu)體標簽。學完Go的結(jié)構(gòu)體,可能你也知道了在Go中是如何模仿面向?qū)ο罅恕?/p>

一定記得多多實踐,多多敲代碼。如果在操作過程中有任何問題,記得下面討論區(qū)留言,我們看到會第一時間解決問題。

我是碼農(nóng)星期八,如果覺得還不錯,記得動手點贊一下哈。感謝你的觀看。

本文轉(zhuǎn)載自微信公眾號「Go語言進階學習」,可以通過以下二維碼關注。轉(zhuǎn)載本文請聯(lián)系Go語言進階學習公眾號。

 

責任編輯:武曉燕 來源: Go語言進階學習
相關推薦

2020-11-30 06:17:03

Go語言

2020-11-26 06:40:24

Go語言基礎

2020-11-23 08:54:14

Go語言結(jié)構(gòu)體

2020-12-20 09:59:13

Go語言基礎技術(shù)

2020-12-02 09:10:22

Go結(jié)構(gòu)數(shù)據(jù)類型

2023-07-29 15:03:29

2021-04-20 09:00:48

Go 語言結(jié)構(gòu)體type

2020-12-23 08:39:11

Go語言基礎技術(shù)

2020-12-16 08:07:28

語言基礎反射

2020-11-05 09:58:16

Go語言Map

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語言

2022-04-27 10:01:43

切片Go封裝

2020-12-30 09:04:32

Go語言TCPUDP

2020-10-25 07:33:13

Go語言

2020-12-09 09:59:32

Go語言技術(shù)

2021-02-20 10:06:14

語言文件操作
點贊
收藏

51CTO技術(shù)棧公眾號