日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
Go語(yǔ)言基礎(chǔ)之結(jié)構(gòu)體(春日篇)

前言

10年積累的成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶(hù)對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶(hù)得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先建設(shè)網(wǎng)站后付款的網(wǎng)站建設(shè)流程,更有靈武免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

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

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

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

回憶map

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

 
 
 
 
  1. //方式一 
  2. var student = map[string]string{ 
  3.     "Name": "張三", 
  4.     "Age":  "18", 
  5. //方式二 
  6. var student2 = make(map[string]string, 10) 
  7. student2["Name"] = "張三" 
  8. student2["Age"] = "18" 

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

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

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

前戲補(bǔ)充

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

自定義類(lèi)型

 
 
 
 
  1. type 自定義類(lèi)型名 類(lèi)型名 
  2. 例: 
  3. type NewInt int 

完整代碼

 
 
 
 
  1. package main 
  2.  
  3. import "fmt" 
  4.  
  5. type NewInt int 
  6.  
  7. func main() { 
  8.     var n1 NewInt = 1 
  9.     fmt.Println(n1)//結(jié)果為1 

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

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

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

類(lèi)型別名

代碼

 
 
 
 
  1. type 類(lèi)型別名 = 類(lèi)型名 
  2. 例: 
  3. type Nint = int 

完整代碼

 
 
 
 
  1. package main 
  2.  
  3. import "fmt" 
  4.  
  5. type Nint = int 
  6.  
  7. func main() { 
  8.     var n1 Nint = 1 
  9.     fmt.Println(n1)//1 

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

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

代碼

 
 
 
 
  1. package main 
  2.  
  3. import "fmt" 
  4.  
  5. type Nint1 int   //自定義類(lèi)型 
  6. type Nint2 = int //類(lèi)型別名 
  7.  
  8. func main() { 
  9.     var n1 Nint1 = 1 
  10.     var n2 Nint2 = 1 
  11.     fmt.Printf("n1類(lèi)型:%T,n2類(lèi)型:%T", n1, n2) 

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

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

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

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

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

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

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

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

語(yǔ)法

 
 
 
 
  1. type 結(jié)構(gòu)體名 struct { 
  2.     字段1 字段類(lèi)型1 
  3.     字段2 字段類(lèi)型2 
  4.     ... 

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

 
 
 
 
  1. type Student struct { 
  2.     Name   string 
  3.     Age    int 
  4.     Height int 
  5.     Weight int 
  6.     phone string 

注:如果字段類(lèi)型是相同的,可以寫(xiě)在同一行。

 
 
 
 
  1. type Student struct { 
  2.   Name                string 
  3.   Age, Height, Weight int 
  4.   phone               string 

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

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

 
 
 
 
  1. func main() { 
  2.   var s1 = Student{ 
  3.     Name:   "張三", 
  4.     Age:    18, 
  5.     Height: 180, 
  6.     Weight: 120, 
  7.     phone:  "6666666", 
  8.   } 
  9.   fmt.Println(s1) 

方式二,先聲明,后賦值

 
 
 
 
  1. func main() { 
  2.   var s1 Student 
  3.   s1.Name = "張三" 
  4.   s1.Age = 18 
  5.   s1.Height = 180 
  6.   s1.Weight = 120 
  7.   s1.phone = "66666" 

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

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

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

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

方式一,先聲明,后賦值

 
 
 
 
  1. func main() { 
  2.   var car struct { 
  3.     Name   string; 
  4.     CarNum string 
  5.   } 
  6.   car.Name = "QQ" 
  7.   car.CarNum = "京6666" 
  8.   fmt.Println(car) //{QQ 京6666} 

方式二,聲明+初始化

 
 
 
 
  1. func main() { 
  2.   var car = struct { 
  3.     Name   string; 
  4.     CarNum string 
  5.   }{ 
  6.     Name:   "QQ", 
  7.     CarNum: "京6666", 
  8.   } 
  9.  
  10.   fmt.Println(car) //{QQ 京6666} 

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

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

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

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

代碼

 
 
 
 
  1. func main() { 
  2.   //方式一,等于一個(gè)空&結(jié)構(gòu)體在賦值 
  3.   var s1 = &Student{} 
  4.   s1.Name = "張三" 
  5.   //... 
  6.   //方式二,直接賦值 
  7.   var s2 = &Student{ 
  8.     Name:   "", 
  9.     Age:    0, 
  10.     Height: 0, 
  11.     Weight: 0, 
  12.     phone:  "", 
  13.   } 
  14.   //方式三不可以 
  15.   //var s3 &Student//error 

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

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

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

 
 
 
 
  1. package main 
  2.  
  3. import "fmt" 
  4.  
  5. type Student struct { 
  6.   Name                string 
  7.   Age, Height, Weight int 
  8.   phone               string 
  9.  
  10. func sayStudent1(s Student) { 
  11.   fmt.Println(s) 
  12. func sayStudent2(s *Student) { 
  13.   //如果穿的是結(jié)構(gòu)體地址,那么接收就需要用* 
  14.   fmt.Println(s) 
  15. func main() { 
  16.   var s1 = Student{ 
  17.     Name:   "111", 
  18.     Age:    0, 
  19.     Height: 0, 
  20.     Weight: 0, 
  21.     phone:  "1111", 
  22.   } 
  23.   var s2 = &Student{ 
  24.     Name:   "2222", 
  25.     Age:    0, 
  26.     Height: 0, 
  27.     Weight: 0, 
  28.     phone:  "2222", 
  29.   } 
  30.   sayStudent1(s1) 
  31.   sayStudent2(s2) 

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

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

代碼

 
 
 
 
  1. func main() { 
  2.   var s1 = Student{} 
  3.   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)體等。

本文轉(zhuǎn)載自微信公眾號(hào)「Go語(yǔ)言進(jìn)階學(xué)習(xí)」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系Go語(yǔ)言進(jìn)階學(xué)習(xí)公眾號(hào)。


網(wǎng)頁(yè)題目:Go語(yǔ)言基礎(chǔ)之結(jié)構(gòu)體(春日篇)
路徑分享:http://m.5511xx.com/article/cddogce.html