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語(yǔ)言基礎(chǔ)之結(jié)構(gòu)體(春日篇)

        共 3627字,需瀏覽 8分鐘

         ·

        2021-12-30 08:41

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

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

        冰泉冷澀弦凝絕,凝絕不通聲暫歇。

        前言

        Hey,大家好呀,我是星期八,終于迎來(lái)了Go中最大一個(gè)知識(shí)點(diǎn),結(jié)構(gòu)體。

        在Go,是沒(méi)有類和對(duì)象這個(gè)概念的。

        是通過(guò)結(jié)構(gòu)體的各種操作,模擬出來(lái)的像Java,Python之類的面向?qū)ο蟮摹?/span>


        回憶map

        之前我們講過(guò),Go語(yǔ)言的map是鍵值對(duì)的方式存儲(chǔ)數(shù)據(jù)的,就像這樣的。不記得的小伙伴請(qǐng)戳:一篇文章帶你了解Go語(yǔ)言基礎(chǔ)之mapGo語(yǔ)言基礎(chǔ)之map補(bǔ)充。

        //方式一var student = map[string]string{    "Name": "張三",    "Age":  "18",}//方式二var student2 = make(map[string]string, 10)student2["Name"] = "張三"student2["Age"] = "18"

        但是這樣,似乎有一個(gè)弊端,我不知道我有幾個(gè)key,并且value類型是固定的。

        理論來(lái)說(shuō),key Age 對(duì)應(yīng)的value應(yīng)該是int類型,還有一些其他微妙的問(wèn)題,通過(guò)map都是不太好解決的。

        因?yàn)榻鉀Q這些問(wèn)題,所以,又引出了結(jié)構(gòu)體這個(gè)類型。


        前戲補(bǔ)充

        在開(kāi)始結(jié)構(gòu)體之前呢,先看兩個(gè)奇怪的知識(shí)點(diǎn)。


        自定義類型

        代碼

        type 自定義類型名 類型名例:type NewInt int

        完整代碼

        package main
        import "fmt"
        type NewInt int
        func main() { var n1 NewInt = 1 fmt.Println(n1)//結(jié)果為1}

        如果要是理解的話,可以理解為NewInt包含了int的功能。

        這里可以把NewInt當(dāng)作int來(lái)使用。

        注:NewInt是一個(gè)新的類型,它包含int,并不等于int。


        類型別名

        代碼

        type 類型別名 = 類型名例:type Nint = int

        完整代碼

        package main
        import "fmt"
        type Nint = int
        func main() { var n1 Nint = 1 fmt.Println(n1)//1}


        自定義類型和類型別名區(qū)別

        可能猛一看,感覺(jué)自定義類型和類型別名似乎一樣,但是其實(shí)是不太一樣的。

        代碼

        package main
        import "fmt"
        type Nint1 int //自定義類型type Nint2 = int //類型別名
        func main() { var n1 Nint1 = 1 var n2 Nint2 = 1 fmt.Printf("n1類型:%T,n2類型:%T", n1, n2)}

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

        結(jié)論:自定義類型真的是自定義類型,類型都變了,類型別名只是類型名變了,但是本質(zhì)沒(méi)變。


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

        Go語(yǔ)言的結(jié)構(gòu)體,相當(dāng)Java,Python等語(yǔ)言中的類,已經(jīng)不再是簡(jiǎn)簡(jiǎn)單單的結(jié)構(gòu)體那么簡(jiǎn)單了。

        結(jié)構(gòu)體屬于基本數(shù)據(jù)類型。

        內(nèi)存圖大概如下。


        結(jié)構(gòu)體定義

        定義結(jié)構(gòu)體需要用到關(guān)鍵字typestruct

        語(yǔ)法

        type 結(jié)構(gòu)體名 struct {    字段1 字段類型1    字段2 字段類型2    ...}

        示例,通過(guò)結(jié)構(gòu)體描述一個(gè)學(xué)生。

        type Student struct {    Name   string    Age    int    Height int    Weight int    phone string}

        注:如果字段類型是相同的,可以寫在同一行。

        type Student struct {  Name                string  Age, Height, Weight int  phone               string}


        結(jié)構(gòu)體初始化

        方式一,賦值時(shí)初始化

        func main() {  var s1 = Student{    Name:   "張三",    Age:    18,    Height: 180,    Weight: 120,    phone:  "6666666",  }  fmt.Println(s1)}

        方式二,先聲明,后賦值

        func main() {  var s1 Student  s1.Name = "張三"  s1.Age = 18  s1.Height = 180  s1.Weight = 120  s1.phone = "66666"}

        兩個(gè)執(zhí)行結(jié)果。


        匿名結(jié)構(gòu)體

        有時(shí)候我們的函數(shù)可能會(huì)要求傳入一個(gè)結(jié)構(gòu)體,但是你又不想定義,就想臨時(shí)用一下,趕緊傳參得了。

        這時(shí)候可以考慮匿名結(jié)構(gòu)體。

        方式一,先聲明,后賦值

        func main() {  var car struct {    Name   string;    CarNum string  }  car.Name = "QQ"  car.CarNum = "京6666"  fmt.Println(car) //{QQ 京6666}}


        方式二,聲明+初始化

        func main() {  var car = struct {    Name   string;    CarNum string  }{    Name:   "QQ",    CarNum: "京6666"  }
        fmt.Println(car) //{QQ 京6666}}

        兩個(gè)執(zhí)行結(jié)果。


        通過(guò)&方式初始化結(jié)構(gòu)體

        通過(guò)&的方式初始化,性能會(huì)提高一點(diǎn),因?yàn)榉祷氐氖堑谝粋€(gè)的指針。

        但是操作過(guò)程跟上述一樣,Go已經(jīng)封裝好了。

        代碼

        func main() {  //方式一,等于一個(gè)空&結(jié)構(gòu)體在賦值  var s1 = &Student{}  s1.Name = "張三"  //...  //方式二,直接賦值  var s2 = &Student{    Name:   ""    Age:    0,    Height: 0    Weight: 0,    phone:  "",  }  //方式三不可以  //var s3 &Student//error}

        使用&的方式基本跟原來(lái)一樣,但是方式三不行。


        &初始化結(jié)構(gòu)體函數(shù)注意事項(xiàng)

        如果使用&的方式,那函數(shù)參數(shù)也要變一下的。

        package main
        import "fmt"
        type Student struct { Name string Age, Height, Weight int phone string}
        func sayStudent1(s Student) { fmt.Println(s)}func sayStudent2(s *Student) { //如果穿的是結(jié)構(gòu)體地址,那么接收就需要用* fmt.Println(s)}func main() { var s1 = Student{ Name: "111", Age: 0, Height: 0, Weight: 0, phone: "1111", } var s2 = &Student{ Name: "2222", Age: 0 Height: 0, Weight: 0, phone: "2222", } sayStudent1(s1) sayStudent2(s2)}

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


        關(guān)于結(jié)構(gòu)體默認(rèn)值

        代碼

        func main() {  var s1 = Student{}  fmt.Println(s1)}

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

        在操作結(jié)構(gòu)體時(shí),即使沒(méi)有賦值,也會(huì)有默認(rèn)值,所以不用擔(dān)心會(huì)報(bào)錯(cuò)。

        int默認(rèn)值是0,string默認(rèn)值是"",等。


        總結(jié)

        上述我們學(xué)習(xí)了Go語(yǔ)言基礎(chǔ)的結(jié)構(gòu)體,先是回憶了map,map的優(yōu)缺點(diǎn),然后引入結(jié)構(gòu)體。

        講述了結(jié)構(gòu)體如何創(chuàng)建賦值,什么是匿名結(jié)構(gòu)體,直接通過(guò)&賦值結(jié)構(gòu)體等。

        一定要在下面多多練習(xí),如果在操作過(guò)程中有任何問(wèn)題,記得下面討論區(qū)留言,我們看到會(huì)第一時(shí)間解決問(wèn)題。

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

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

        往期精彩文章推薦:

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

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

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

        瀏覽 31
        點(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>
            三级网站在线 | 草草在线观看 | 日韩av电影免费在线观看 | 欧美一级特黄大片做受148148 | 国产精品久久久久999 | 成人毛片在线播放 | 青青草原在线视频网站 | 一级黄网站 | 国产精品国产三级国产aⅴ浪潮 | 久久99婷婷 |