Go語(yǔ)言基礎(chǔ)之結(jié)構(gòu)體(春日篇)
回復(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ǔ)之map、Go語(yǔ)言基礎(chǔ)之map補(bǔ)充。
//方式一var student = map[string]string{"Name": "張三","Age": "18",}//方式二var student2 = make(map[string]string, 10)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 mainimport "fmt"type NewInt intfunc main() {var n1 NewInt = 1fmt.Println(n1)//結(jié)果為1}
如果要是理解的話,可以理解為NewInt包含了int的功能。
這里可以把NewInt當(dāng)作int來(lái)使用。
注:NewInt是一個(gè)新的類型,它包含int,并不等于int。
類型別名
代碼
type 類型別名 = 類型名例:type Nint = int
完整代碼
package mainimport "fmt"type Nint = intfunc main() {var n1 Nint = 1fmt.Println(n1)//1}
自定義類型和類型別名區(qū)別
可能猛一看,感覺(jué)自定義類型和類型別名似乎一樣,但是其實(shí)是不太一樣的。
代碼
package mainimport "fmt"type Nint1 int //自定義類型type Nint2 = int //類型別名func main() {var n1 Nint1 = 1var n2 Nint2 = 1fmt.Printf("n1類型:%T,n2類型:%T", n1, n2)}
執(zhí)行結(jié)果。

結(jié)論:自定義類型真的是自定義類型,類型都變了,類型別名只是類型名變了,但是本質(zhì)沒(méi)變。
結(jié)構(gòu)體
Go語(yǔ)言的結(jié)構(gòu)體,相當(dāng)Java,Python等語(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)鍵字type和struct。
語(yǔ)法
type 結(jié)構(gòu)體名 struct {字段1 字段類型1字段2 字段類型2...}
示例,通過(guò)結(jié)構(gòu)體描述一個(gè)學(xué)生。
type Student struct {Name stringAge intHeight intWeight intphone string}
注:如果字段類型是相同的,可以寫在同一行。
type Student struct {Name stringAge, Height, Weight intphone 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 Students1.Name = "張三"s1.Age = 18s1.Height = 180s1.Weight = 120s1.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 mainimport "fmt"type Student struct {Name stringAge, Height, Weight intphone 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)體,先是回憶了map,map的優(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è)【在看】行不行
