這篇文章給大家介紹Go語言中結(jié)構(gòu)體的作用是什么,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
我們提供的服務(wù)有:成都網(wǎng)站制作、網(wǎng)站建設(shè)、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、井陘ssl等。為近千家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的井陘網(wǎng)站制作公司
自定義類型
type 自定義類型名 類型名 例: type NewInt int
完整代碼
package main import "fmt" type NewInt int func main() { var n1 NewInt = 1 fmt.Println(n1)//結(jié)果為1 }
如果要是理解的話,可以理解為NewInt包含了int的功能。
這里可以把NewInt當(dāng)作int來使用。
注:NewInt是一個新的類型,它包含int,并不等于int。
類型別名
代碼
type 類型別名 = 類型名 例: type Nint = int
完整代碼
package main import "fmt" type Nint = int func main() { var n1 Nint = 1 fmt.Println(n1)//1 }
自定義類型和類型別名區(qū)別
可能猛一看,感覺自定義類型和類型別名似乎一樣,但是其實(shí)是不太一樣的。
代碼
package main import "fmt" type Nint1 int //自定義類型 type Nint2 = int //類型別名 func main() { var n1 Nint1 = 1 var n2 Nint2 = 1 fmt.Printf("n1類型:%T,n2類型:%T", n1, n2) }
執(zhí)行結(jié)果。
結(jié)論:自定義類型真的是自定義類型,類型都變了,類型別名只是類型名變了,但是本質(zhì)沒變。
結(jié)構(gòu)體
Go語言的結(jié)構(gòu)體,相當(dāng)Java,Python等語言中的類,已經(jīng)不再是簡簡單單的結(jié)構(gòu)體那么簡單了。
結(jié)構(gòu)體屬于基本數(shù)據(jù)類型。
內(nèi)存圖大概如下。
結(jié)構(gòu)體定義
定義結(jié)構(gòu)體需要用到關(guān)鍵字type和struct。
語法
type 結(jié)構(gòu)體名 struct { 字段1 字段類型1 字段2 字段類型2 ... }
示例,通過結(jié)構(gòu)體描述一個學(xué)生。
type Student struct { Name string Age int Height int Weight int phone string }
注:如果字段類型是相同的,可以寫在同一行。
type Student struct { Name string Age, Height, Weight int phone string }
結(jié)構(gòu)體初始化
方式一,賦值時初始化
func main() { var s1 = Student{ Name: "張三", Age: 18, Height: 180, Weight: 120, phone: "6666666", } fmt.Println(s1) }
方式二,先聲明,后賦值
func main() { var s1 Student s1.Name = "張三" s1.Age = 18 s1.Height = 180 s1.Weight = 120 s1.phone = "66666" }
兩個執(zhí)行結(jié)果。
匿名結(jié)構(gòu)體
有時候我們的函數(shù)可能會要求傳入一個結(jié)構(gòu)體,但是你又不想定義,就想臨時用一下,趕緊傳參得了。
這時候可以考慮匿名結(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} }
兩個執(zhí)行結(jié)果。
通過&方式初始化結(jié)構(gòu)體
通過&的方式初始化,性能會提高一點(diǎn),因?yàn)榉祷氐氖堑谝粋€的指針。
但是操作過程跟上述一樣,Go已經(jīng)封裝好了。
代碼
func main() { //方式一,等于一個空&結(jié)構(gòu)體在賦值 var s1 = &Student{} s1.Name = "張三" //... //方式二,直接賦值 var s2 = &Student{ Name: "", Age: 0, Height: 0, Weight: 0, phone: "", } //方式三不可以 //var s3 &Student//error }
使用&的方式基本跟原來一樣,但是方式三不行。
&初始化結(jié)構(gòu)體函數(shù)注意事項
如果使用&的方式,那函數(shù)參數(shù)也要變一下的。
package main import "fmt" type Student struct { Name string Age, Height, Weight int phone 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)體時,即使沒有賦值,也會有默認(rèn)值,所以不用擔(dān)心會報錯。
int默認(rèn)值是0,string默認(rèn)值是"",等。
關(guān)于Go語言中結(jié)構(gòu)體的作用是什么就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。