成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go語言基礎之結構體(秋日篇)

開發 后端
本篇我們學習Go基礎之結構體的匿名字段結構體,結構體嵌套,匿名結構體嵌套,匿名嵌套結構體字段沖突。

[[354630]]

 前言

Hey,大家好呀,碼農我是星期八,咱們接著上次繼續說,看一下結構體還有什么其他操作。沒來得及上車的小伙伴請戳:Go語言基礎之結構體(春日篇)、Go語言基礎之結構體(夏日篇)。

匿名字段結構體

如果以后再遇到匿名這個詞,就把他當作沒有名字的意思。

匿名加字段結構體代碼。

  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行代碼,如果去掉注釋會報錯。

這就說明了個問題,如果是匿名字段結構體,匿名字段類型是不能重復的,如上述代碼所示。

結構體嵌套

結構體嵌套,就如名字一樣,一個結構體,嵌套了另外一個結構體。

假設

一個學生的信息,假設有姓名,年齡,性別,這三個字段。

這個學生必定要歸屬一個班級的,假設這個班級的信息有年級,幾班,班主任姓名。

創建結構體

根據上述敘述,我們知道一定是有兩個結構體的,至少一個是學生,一個是班級。

班級結構體

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

學生結構體

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

可以看到第5行代碼,結構體的字段類型直接是一個結構體,這就是結構體嵌套、

當一個結構體不能完整描述一個對象時,或者說本來就是獨立的對象有關聯時,就需要結構體嵌套。

嵌套結構體賦值

方式一,直接賦值嵌套結構體

  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) 

兩次執行結果


其實方式一和方式二的本質是一樣的,只不過是方式二將嵌套的結構體單獨賦值了而已。

匿名嵌套字段

上述我們的Student結構體是這樣寫的。

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

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

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

但是在賦值時,就要注意了,因為Student結構體已經沒有字段名了,所以就不能使用上述的方式賦值了

需要這種。

  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.   } 

沒錯,第5行的字段名是Classes結構體名。

執行結果還是一樣的。

 

補充

上述是直接通過定義變量時就直接賦值了。

其實不管是結構體,還是嵌套結構體,都還有一種方法,就是通過.的方式賦值,代碼如下。

結構體嵌套

默認的結構體嵌套,結構體還是有字段名的。

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

所以賦值代碼如下。

  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行代碼開始,通過s1找到class這個字段,再根據class找到class具體對應的值進行賦值。

匿名嵌套字段

匿名嵌套字段是沒有字段名的,是有一個字段類型。

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

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

  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) 

通過s1直接找到Classes這個結構體,再根據這個結構體找到里面具體的值,進行賦值。

其實跟定義變量時賦值相似。

但是終究執行結果,還是一樣的,只是賦值形式不同。

結論

根據嵌套結構體和匿名嵌套結構體再賦值時可以發現。

如果嵌套結構體有字段名,通過字段名找具體的字段,進行賦值。

如果是嵌套結構體匿名字段,通過嵌套結構體的名字,找具體字段,進行賦值。

嵌套結構體字段沖突

這個沖突的問題,其實還是比較少見的,這個問題通常情況下,只會出現在匿名嵌套場景中。

還是上述的結構體,但是賦值可以是這樣操作的。

  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行,直接通過s1.Grade賦值,其實是省去了一個Classes,但是這種操作,只有在匿名嵌套結構體中可以使用。

但是如果我將結構體改成這樣子。

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

Student結構體有兩個匿名嵌套結構體,一個是Classes,一個是Course。

但是有一個字段,是沖突的,就是TeacherName,如果還是通過懶的方式賦值,會發生什么呢?

  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字段,這時候就會出問題了。

 

意思很簡單,就是不知道是Classes的TeacherName還是Course的TeacherName。

這時候,就必須要指定了。

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

總結

個人建議,還是盡量不要使用匿名嵌套結構體。

如果使用了匿名嵌套結構體,盡可能的采用標準方式賦值,不要采用懶得方式。

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

最后的總結

上述我們學習了Go基礎之結構體的匿名字段結構體,結構體嵌套,匿名結構體嵌套,匿名嵌套結構體字段沖突。

各位小伙伴一定要實踐一下,親手打一下代碼,堅持就是勝利,奧里給!

 

責任編輯:姜華 來源: Go語言進階學習
相關推薦

2020-12-02 08:45:36

Go語言

2020-11-26 06:40:24

Go語言基礎

2020-11-23 08:54:14

Go語言結構體

2020-12-20 09:59:13

Go語言基礎技術

2020-12-02 09:10:22

Go結構數據類型

2023-07-29 15:03:29

2021-04-20 09:00:48

Go 語言結構體type

2020-11-05 09:58:16

Go語言Map

2020-12-16 08:07:28

語言基礎反射

2020-12-23 08:39:11

Go語言基礎技術

2022-02-16 10:03:06

對象接口代碼

2020-10-22 08:33:22

Go語言

2020-11-11 10:52:54

Go語言C語言

2021-06-09 09:06:52

Go語言算法

2021-02-06 18:19:54

TimeGo語言

2021-10-09 07:10:31

Go語言基礎

2022-04-27 10:01:43

切片Go封裝

2020-10-23 08:38:19

Go語言

2020-10-25 07:33:13

Go語言

2020-12-09 09:59:32

Go語言技術
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 99r在线 | 国产精品国产a级 | 色久影院 | 国产成人精品一区二区三区在线 | 欧美一级在线视频 | 日韩欧美久久 | 亚洲精品电影网在线观看 | 欧美成人一区二免费视频软件 | 国产麻豆乱码精品一区二区三区 | 亚洲一区二区三区在线视频 | 精品区一区二区 | 女同久久另类99精品国产 | 黄网站涩免费蜜桃网站 | 国产在线永久免费 | 成人免费黄色 | 国产性网| 国产日韩欧美一区 | 99精品热视频 | 久色一区| 综合二区 | 成人在线视频网址 | 视频一区二区三区中文字幕 | 精品欧美一区二区三区 | 亚洲日本视频 | 国产欧美一区二区三区在线看 | av日韩在线播放 | 国产伦一区二区三区 | 999热视频 | 亚洲视频在线观看免费 | 一区在线视频 | 波多野结衣中文字幕一区二区三区 | 亚洲精品自在在线观看 | 亚洲人a | 91精品国产手机 | 久久久久久999 | gogo肉体亚洲高清在线视 | 亚洲精品乱码8久久久久久日本 | 国产精品完整版 | 亚洲视频免费在线观看 | 日本精品久久久久 | 国产午夜精品一区二区三区在线观看 |