<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)體(秋日篇)

          共 4701字,需瀏覽 10分鐘

           ·

          2022-01-15 21:59

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

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

          銀瓶乍破水漿迸,鐵騎突出刀槍鳴。

          前言

          Hey,大家好呀,碼農(nóng)我是星期八,咱們接著上次繼續(xù)說(shuō),看一下結(jié)構(gòu)體還有什么其他操作。沒來(lái)得及上車的小伙伴請(qǐng)戳:Go語(yǔ)言基礎(chǔ)之結(jié)構(gòu)體(春日篇)Go語(yǔ)言基礎(chǔ)之結(jié)構(gòu)體(夏日篇)


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

          如果以后再遇到匿名這個(gè),就把他當(dāng)作沒有名字的意思。

          匿名加字段結(jié)構(gòu)體代碼

          package main
          import "fmt"
          type Student struct { string int //string //error:duplicate field string //int //error:duplicate field string}
          func main() { var s1 = Student{ "666" 0} fmt.Println(s1)}

          8行和第9行代碼,如果去掉注釋會(huì)報(bào)錯(cuò)。

          這就說(shuō)明了個(gè)問(wèn)題,如果是匿名字段結(jié)構(gòu)體,匿名字段類型是不能重復(fù)的,如上述代碼所示。


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

          結(jié)構(gòu)體嵌套,就如名字一樣,一個(gè)結(jié)構(gòu)體,嵌套了另外一個(gè)結(jié)構(gòu)體。

          假設(shè)

          一個(gè)學(xué)生的信息,假設(shè)有姓名年齡性別,這三個(gè)字段。

          這個(gè)學(xué)生必定要?dú)w屬一個(gè)班級(jí)的,假設(shè)這個(gè)班級(jí)的信息有年級(jí)幾班班主任姓名


          創(chuàng)建結(jié)構(gòu)體

          根據(jù)上述敘述,我們知道一定是有兩個(gè)結(jié)構(gòu)體的,至少一個(gè)是學(xué)生,一個(gè)是班級(jí)。

          班級(jí)結(jié)構(gòu)體

          type Classes struct {    Grade       int    //年級(jí)    Class       int    //班級(jí)    TeacherName string //班主任姓名}

          學(xué)生結(jié)構(gòu)體

          type Student struct {    Name   string  //姓名    Age    int     //年齡    Gender string  //性別    class  Classes //所屬班級(jí)}

          可以看到第5行代碼,結(jié)構(gòu)體字段類型直接是一個(gè)結(jié)構(gòu)體,這就是結(jié)構(gòu)體嵌套、

          當(dāng)一個(gè)結(jié)構(gòu)體不能完整描述一個(gè)對(duì)象時(shí),或者說(shuō)本來(lái)就是獨(dú)立的對(duì)象有關(guān)聯(lián)時(shí),就需要結(jié)構(gòu)體嵌套。


          嵌套結(jié)構(gòu)體賦值

          方式一,直接賦值嵌套結(jié)構(gòu)體
          func main() {    var s1 = Student{        Name:   "張三",        Age:    18,        Gender: "男",        class: Classes{            Grade:       2020,            Class:       1,            TeacherName: "張三的老師",        },}    fmt.Println(s1)}


          方式二,分開賦值
          func main() {    var c1 = Classes{        Grade:       2020,        Class:       1,        TeacherName: "張三的老師",}    var s2 = Student{        Name:   "張三",        Age:    18,        Gender: "男",        class:  c1,}    fmt.Println(s2)}

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

          其實(shí)方式一方式二的本質(zhì)是一樣的,只不過(guò)是方式二嵌套的結(jié)構(gòu)體單獨(dú)賦值了而已。


          匿名嵌套字段

          上述我們的Student結(jié)構(gòu)體是這樣寫的。

          type Student struct {    Name   string  //姓名    Age    int     //年齡    Gender string  //性別    class  Classes //所屬班級(jí)}

          但是其實(shí)第5行代碼的字段是可以省略的,就像這樣。

          type Student struct {    Name   string  //姓名    Age    int     //年齡    Gender string  //性別    Classes //所屬班級(jí)}

          但是在賦值時(shí),就要注意了,因?yàn)?/span>Student結(jié)構(gòu)體已經(jīng)沒有字段名了,所以就不能使用上述的方式賦值了

          需要這種。

          func main() {    var s1 = Student{        Name:   "張三",        Age:    18,        Gender: "男",        Classes: Classes{            Grade:       2020,            Class:       1,            TeacherName: "張三的老師",????},  }}

          沒錯(cuò),第5行的字段名是Classes結(jié)構(gòu)體名。

          執(zhí)行結(jié)果還是一樣的。


          補(bǔ)充

          上述是直接通過(guò)定義變量時(shí)就直接賦值了。

          其實(shí)不管是結(jié)構(gòu)體,還是嵌套結(jié)構(gòu)體,都還有一種方法,就是通過(guò).的方式賦值,代碼如下。

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

          默認(rèn)的結(jié)構(gòu)體嵌套,結(jié)構(gòu)體還是有字段名的。

          type Student struct {  Name    string //姓名  Age     int    //年齡  Gender  string //性別  class Classes        //所屬班級(jí)}

          所以賦值代碼如下。

          func main() {  var s1 Student  s1.Name = "張三"  s1.Age = 18  s1.Gender = "男"  s1.class.Grade = 2020  s1.class.Class = 1  s1.class.TeacherName = "張三的老師"  fmt.Println(s1)}

          第6行代碼開始,通過(guò)s1找到class這個(gè)字段,再根據(jù)class找到class具體對(duì)應(yīng)的值進(jìn)行賦值。


          匿名嵌套字段

          匿名嵌套字段是沒有字段名的,是有一個(gè)字段類型

          type Student struct {  Name    string //姓名  Age     int    //年齡  Gender  string //性別  Classes        //所屬班級(jí)}

          所以賦值跟上述也不太一樣,是這樣的。

          func main() {  var s1 Student  s1.Name = "張三"  s1.Age = 18  s1.Gender = "男"  s1.Classes.Grade = 2020  s1.Classes.Class = 1  s1.Classes.TeacherName = "張三的老師"  fmt.Println(s1)}

          通過(guò)s1直接找到Classes這個(gè)結(jié)構(gòu)體,再根據(jù)這個(gè)結(jié)構(gòu)體找到里面具體的值,進(jìn)行賦值。

          其實(shí)跟定義變量時(shí)賦值相似。

          但是終究執(zhí)行結(jié)果,還是一樣的,只是賦值形式不同。


          結(jié)論

          根據(jù)嵌套結(jié)構(gòu)體匿名嵌套結(jié)構(gòu)體再賦值時(shí)可以發(fā)現(xiàn)。

          如果嵌套結(jié)構(gòu)體有字段名,通過(guò)字段名找具體的字段,進(jìn)行賦值。

          如果是嵌套結(jié)構(gòu)體匿名字段,通過(guò)嵌套結(jié)構(gòu)體的名字,找具體字段,進(jìn)行賦值。


          嵌套結(jié)構(gòu)體字段沖突

          這個(gè)沖突的問(wèn)題,其實(shí)還是比較少見的,這個(gè)問(wèn)題通常情況下,只會(huì)出現(xiàn)在匿名嵌套場(chǎng)景中。

          還是上述的結(jié)構(gòu)體,但是賦值可以是這樣操作的。

          func main() {  var s1 Student  s1.Name = "張三"  s1.Age = 18  s1.Gender = "男"  s1.Classes.Grade = 2020  s1.Classes.Class = 1  s1.Classes.TeacherName = "張三的老師"  //######### 分割 ##########  s1.Grade = 2020    //省去了Classes  s1.Class = 1    //省去了Classes  s1.TeacherName = "張三的老師"  //省去了Classes  fmt.Println(s1)}

          第10行,直接通過(guò)s1.Grade賦值,其實(shí)是省去了一個(gè)Classes,但是這種操作,只有在匿名嵌套結(jié)構(gòu)體中可以使用。

          但是如果我將結(jié)構(gòu)體改成這樣子。

          //班級(jí)type Classes struct {  Grade       int    //年級(jí)  Class       int    //班級(jí)  TeacherName string //班主任姓名}
          //課程type Course struct { CourseName string //課程名字 TeacherName string //任課老師姓名}
          //學(xué)生type Student struct { Name string //姓名 Age int //年齡 Gender string //性別 Classes //所屬班級(jí) Course //任課老師}

          Student結(jié)構(gòu)體有兩個(gè)匿名嵌套結(jié)構(gòu)體,一個(gè)是Classes,一個(gè)是Course

          但是有一個(gè)字段,是沖突的,就是TeacherName,如果還是通過(guò)懶的方式賦值,會(huì)發(fā)生什么呢?

          func main() {  var s1 Student  s1.Name = "張三"  s1.Age = 18  s1.Gender = "男"  s1.Grade = 2020  s1.Class = 1  s1.TeacherName = "張三的老師"  fmt.Println(s1)}

          第8行,直接找TeacherName字段,這時(shí)候就會(huì)出問(wèn)題了。

          意思很簡(jiǎn)單,就是不知道是ClassesTeacherName還是CourseTeacherName

          這時(shí)候,就必須要指定了。

          s1.Classes.TeacherName = "張三的班主任"s1.Course.TeacherName = "張三的任課老師"


          總結(jié)

          個(gè)人建議,還是盡量不要使用匿名嵌套結(jié)構(gòu)體

          如果使用了匿名嵌套結(jié)構(gòu)體,盡可能的采用標(biāo)準(zhǔn)方式賦值,不要采用懶得方式。

          如果采用了懶的方式,一定要注意有沒有字段沖突


          最后的總結(jié)

          上述我們學(xué)習(xí)了Go基礎(chǔ)之結(jié)構(gòu)體的匿名字段結(jié)構(gòu)體結(jié)構(gòu)體嵌套匿名結(jié)構(gòu)體嵌套匿名嵌套結(jié)構(gòu)體字段沖突

          各位小伙伴一定要實(shí)踐一下,親手打一下代碼,堅(jiān)持就是勝利,奧里給!

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

          我是碼農(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ù)【入群

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

          瀏覽 89
          點(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伊人在线 | 色综合激情视频 | 最近中文字幕免费MV第一季歌词怀孕 | 亚洲男人的天堂再线观看 |