自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

開發(fā) 后端
本篇我們學(xué)習(xí)Go基礎(chǔ)之結(jié)構(gòu)體的匿名字段結(jié)構(gòu)體,結(jié)構(gòu)體嵌套,匿名結(jié)構(gòu)體嵌套,匿名嵌套結(jié)構(gòu)體字段沖突。

[[354630]]

 前言

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

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

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

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

  1. package main 
  2.  
  3. import "fmt" 
  4.  
  5. type Student struct { 
  6.     string 
  7.     int 
  8.     //string //error:duplicate field string 
  9.     //int    //error:duplicate field string 
  10.  
  11. func main() { 
  12.     var s1 = Student{ 
  13.         "666", 
  14.         0, 
  15.     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)體

  1. type Classes struct { 
  2.     Grade       int    //年級(jí) 
  3.     Class       int    //班級(jí) 
  4.     TeacherName string //班主任姓名 

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

  1. type Student struct { 
  2.     Name   string  //姓名 
  3.     Age    int     //年齡 
  4.     Gender string  //性別 
  5.     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)體

  1. func main() { 
  2.     var s1 = Student{ 
  3.         Name:   "張三", 
  4.         Age:    18, 
  5.         Gender: "男", 
  6.         class: Classes{ 
  7.             Grade:       2020, 
  8.             Class:       1, 
  9.             TeacherName: "張三的老師", 
  10.         }, 
  11.     fmt.Println(s1) 

方式二,分開賦值

  1. func main() { 
  2.     var c1 = Classes{ 
  3.         Grade:       2020, 
  4.         Class:       1, 
  5.         TeacherName: "張三的老師", 
  6.     var s2 = Student{ 
  7.         Name:   "張三", 
  8.         Age:    18, 
  9.         Gender: "男", 
  10.         class:  c1, 
  11.     fmt.Println(s2) 

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


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

匿名嵌套字段

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

  1. type Student struct { 
  2.     Name   string  //姓名 
  3.     Age    int     //年齡 
  4.     Gender string  //性別 
  5.     class  Classes //所屬班級(jí) 

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

  1. type Student struct { 
  2.     Name   string  //姓名 
  3.     Age    int     //年齡 
  4.     Gender string  //性別 
  5.     Classes //所屬班級(jí) 

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

需要這種。

  1. func main() { 
  2.     var s1 = Student{ 
  3.         Name:   "張三", 
  4.         Age:    18, 
  5.         Gender: "男", 
  6.         Classes: Classes{ 
  7.             Grade:       2020, 
  8.             Class:       1, 
  9.             TeacherName: "張三的老師", 
  10.     }, 
  11.   } 

沒(méi)錯(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)體還是有字段名的。

  1. type Student struct { 
  2.   Name    string //姓名 
  3.   Age     int    //年齡 
  4.   Gender  string //性別 
  5.   class Classes        //所屬班級(jí) 

所以賦值代碼如下。

  1. func main() { 
  2.   var s1 Student 
  3.   s1.Name = "張三" 
  4.   s1.Age = 18 
  5.   s1.Gender = "男" 
  6.   s1.class.Grade = 2020 
  7.   s1.class.Class = 1 
  8.   s1.class.TeacherName = "張三的老師" 
  9.   fmt.Println(s1) 

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

匿名嵌套字段

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

  1. type Student struct { 
  2.   Name    string //姓名 
  3.   Age     int    //年齡 
  4.   Gender  string //性別 
  5.   Classes        //所屬班級(jí) 

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

  1. func main() { 
  2.   var s1 Student 
  3.   s1.Name = "張三" 
  4.   s1.Age = 18 
  5.   s1.Gender = "男" 
  6.   s1.Classes.Grade = 2020 
  7.   s1.Classes.Class = 1 
  8.   s1.Classes.TeacherName = "張三的老師" 
  9.   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)體,但是賦值可以是這樣操作的。

  1. func main() { 
  2.   var s1 Student 
  3.   s1.Name = "張三" 
  4.   s1.Age = 18 
  5.   s1.Gender = "男" 
  6.   s1.Classes.Grade = 2020 
  7.   s1.Classes.Class = 1 
  8.   s1.Classes.TeacherName = "張三的老師" 
  9.   //######### 分割 ########## 
  10.   s1.Grade = 2020    //省去了Classes 
  11.   s1.Class = 1    //省去了Classes 
  12.   s1.TeacherName = "張三的老師"  //省去了Classes 
  13.   fmt.Println(s1) 

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

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

  1. //班級(jí) 
  2. type Classes struct { 
  3.   Grade       int    //年級(jí) 
  4.   Class       int    //班級(jí) 
  5.   TeacherName string //班主任姓名 
  6.  
  7. //課程 
  8. type Course struct { 
  9.   CourseName  string //課程名字 
  10.   TeacherName string //任課老師姓名 
  11.  
  12. //學(xué)生 
  13. type Student struct { 
  14.   Name    string //姓名 
  15.   Age     int    //年齡 
  16.   Gender  string //性別 
  17.   Classes        //所屬班級(jí) 
  18.   Course         //任課老師 

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

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

  1. func main() { 
  2.   var s1 Student 
  3.   s1.Name = "張三" 
  4.   s1.Age = 18 
  5.   s1.Gender = "男" 
  6.   s1.Grade = 2020 
  7.   s1.Class = 1 
  8.   s1.TeacherName = "張三的老師" 
  9.   fmt.Println(s1) 

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

 

意思很簡(jiǎn)單,就是不知道是Classes的TeacherName還是Course的TeacherName。

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

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

總結(jié)

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

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

如果采用了懶的方式,一定要注意有沒(méi)有字段沖突。

最后的總結(jié)

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

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

 

責(zé)任編輯:姜華 來(lái)源: Go語(yǔ)言進(jìn)階學(xué)習(xí)
相關(guān)推薦

2020-11-26 06:40:24

Go語(yǔ)言基礎(chǔ)

2020-12-02 08:45:36

Go語(yǔ)言

2020-11-23 08:54:14

Go語(yǔ)言結(jié)構(gòu)體

2020-12-20 09:59:13

Go語(yǔ)言基礎(chǔ)技術(shù)

2020-12-02 09:10:22

Go結(jié)構(gòu)數(shù)據(jù)類型

2023-07-29 15:03:29

2021-04-20 09:00:48

Go 語(yǔ)言結(jié)構(gòu)體type

2020-12-23 08:39:11

Go語(yǔ)言基礎(chǔ)技術(shù)

2020-12-16 08:07:28

語(yǔ)言基礎(chǔ)反射

2020-11-05 09:58:16

Go語(yǔ)言Map

2022-02-16 10:03:06

對(duì)象接口代碼

2020-10-22 08:33:22

Go語(yǔ)言

2020-11-11 10:52:54

Go語(yǔ)言C語(yǔ)言

2021-06-09 09:06:52

Go語(yǔ)言算法

2021-02-06 18:19:54

TimeGo語(yǔ)言

2022-04-27 10:01:43

切片Go封裝

2020-12-30 09:04:32

Go語(yǔ)言TCPUDP

2020-10-25 07:33:13

Go語(yǔ)言

2020-12-09 09:59:32

Go語(yǔ)言技術(shù)

2021-02-20 10:06:14

語(yǔ)言文件操作
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)