<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          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]string10)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)JavaPython等語(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)體,先是回憶了mapmap的優(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)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲永久精品视频 | 啊啊啊啊啊网站 | 日韩视频――中文字幕 | 无码久久一区二区三区 | 精品热99|