1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        共 4812字,需瀏覽 10分鐘

         ·

        2020-12-06 02:44

        點(diǎn)擊上方“Go語言進(jìn)階學(xué)習(xí)”,進(jìn)行關(guān)注

        回復(fù)“Go語言”即可獲贈(zèng)從入門到進(jìn)階共10本電子書

        曲終收撥當(dāng)心畫,四弦一聲如裂帛。

        前言

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


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

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

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

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


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

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


        寶馬車

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


        比亞迪車

        //比亞迪車type BYDCar struct {    *Car}

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

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

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

        main代碼

        func main() {    //一個(gè)寶馬對(duì)象    var bmw1 = BMWCar{&Car{        Brand:  "寶馬x8",        CarNum: "京666",        Tyre:   4,}}    //一個(gè)比亞迪對(duì)象    var byd1 = BYDCar{&Car{        Brand:  "比亞迪L3",        CarNum: "京111"        Tyre:   4,}}    //因?yàn)?BMWCar 和 BYDCar 都繼承了Car,所以都有carInfo這個(gè)方法    bmw1.carInfo()    byd1.carInfo()}

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

        這就是一個(gè)最簡單的,面向?qū)ο螅渌Z言一樣,繼承會(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)""包裹。

        就像這樣。

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

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


        切片序列化

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

        示例代碼

        package main
        import ( "encoding/json" "fmt")
        type Student struct { Gender string Name 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類型轉(zhuǎn)成字符串。

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


        map序列化

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

        示例代碼

        package main
        import ( "encoding/json" "fmt")
        type Student struct { Gender string Name 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":"張三"}}

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

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


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

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

        type Student struct {    Name   string    Gender string    Age    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)}

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


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

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

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

        示例代碼

        package main
        import ( "encoding/json" "fmt")
        type Student struct { Name string Gender string Age int}
        func main() { var s1 = Student{ Name: "張三", Gender: "男", Age: 18 } var s2 = Student{ Name: "李四", Gender: "女", Age: 16, } //一個(gè)存放 Student 的列表 var studentList = []Student{s1, s2} fmt.Printf("StudentInfo類型:%T\n", studentList) serializeByte, err := json.Marshal(studentList) //main.Student if err != nil { fmt.Println("序列化失敗") } var serializeStr = string(serializeByte) fmt.Printf("serializeStr類型:%T\n", serializeStr) //string,這是字符串類型 fmt.Printf("serializeStr值:%v\n", serializeStr) }

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


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

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

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


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

        type Student struct {  Name   string `json:"name"`  Gender string `json:"gender"`  Age    int    `json:"age"`}

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

        main代碼

        func main() {  var s1 = Student{    Name:   "張三"    Gender: "男",    Age:    18,  }  fmt.Printf("StudentInfo類型:%T\n", s1)  serializeByte, err := json.Marshal(s1) //main.Student  if err != nil {    fmt.Println("序列化失敗")  }  var serializeStr = string(serializeByte)  fmt.Printf("serializeStr類型:%T\n", serializeStr) //string,這是字符串類型  fmt.Printf("serializeStr值:%v\n", serializeStr)  }

        執(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ū)ο罅恕?/span>

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

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

        -------------------?End?-------------------

        往期精彩文章推薦:

        歡迎大家點(diǎn)贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持

        想加入Go學(xué)習(xí)群請(qǐng)?jiān)诤笈_(tái)回復(fù)【入群

        萬水千山總是情,點(diǎn)個(gè)【在看】行不行

        /今日留言主題/

        瀏覽 34
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            caobbdooa免费毛片在线 | 无码性爱视频免费看 | 影音先锋男人你懂的 | 亚洲乱伦视频 | 两根黑人粗大噗嗤噗嗤视频 | 这里只有精品爱豆视频 | heyzo色臀少妇小早川怜子视频 | 97伊人影院 | 狠狠色伊人亚洲综合网站野外 | 我~慢点~好爽好大~男男动漫 |