日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Go語言基礎(chǔ)之結(jié)構(gòu)體(冬日篇)

 前言

成都創(chuàng)新互聯(lián)專注于雙清企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站設(shè)計(jì),商城網(wǎng)站建設(shè)。雙清網(wǎng)站建設(shè)公司,為雙清等地區(qū)提供建站服務(wù)。全流程按需網(wǎng)站策劃,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)

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

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

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

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

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

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

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

寶馬車

//寶馬車

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

比亞迪車

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

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

這跟繼承有毛關(guān)系?

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

main代碼

 
 
 
 
  1. func main() {
  2.     //一個(gè)寶馬對(duì)象
  3.     var bmw1 = BMWCar{&Car{
  4.         Brand:  "寶馬x8",
  5.         CarNum: "京666",
  6.         Tyre:   4,
  7. }}
  8.     //一個(gè)比亞迪對(duì)象
  9.     var byd1 = BYDCar{&Car{
  10.         Brand:  "比亞迪L3",
  11.         CarNum: "京111",
  12.         Tyre:   4,
  13. }}
  14.     //因?yàn)?nbsp;BMWCar 和 BYDCar 都繼承了Car,所以都有carInfo這個(gè)方法
  15.     bmw1.carInfo()
  16.     byd1.carInfo()
  17. }

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

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

序列化

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

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

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

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

最外面是'號(hào),鍵/值對(duì)組合中的鍵名寫在前面并用雙引號(hào)""包裹。

就像這樣。

 
 
 
 
  1. '{"Gender":"男","Name":"張三"}'    //'說明這個(gè)是字符串,一般打印時(shí)不顯示

序列化我們用到的是json模塊的Marshal方法。

切片序列化

單獨(dú)的切片序列化用的很少,但是仍然還是要知道。

示例代碼

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

第16行代碼將切片序列化,但是返回的是[]byte類型,第21行代碼將[]byte類型轉(zhuǎn)成字符串。

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

map序列化

字典序列化,就比較有味道了,序列化的是一個(gè)標(biāo)準(zhǔn)的json數(shù)據(jù)格式。

示例代碼

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

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

這個(gè)就有點(diǎn)像標(biāo)準(zhǔn)的json格式了。

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

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

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

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)
  15. }

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

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

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

當(dāng)然, 還可以切片嵌套map,方法和此方法一樣,不做例子了。

示例代碼

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

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

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

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

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

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

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

每個(gè)字段后面跟的,就是Tag,一定不要把格式搞錯(cuò)啦。

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)  
  15. }

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

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

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

總結(jié)

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

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

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

本文轉(zhuǎn)載自微信公眾號(hào)「Go語言進(jìn)階學(xué)習(xí)」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系Go語言進(jìn)階學(xué)習(xí)公眾號(hào)。


網(wǎng)站標(biāo)題:Go語言基礎(chǔ)之結(jié)構(gòu)體(冬日篇)
分享路徑:http://www.dlmjj.cn/article/dhceghe.html