Go語言學習之結構體
阿新 • • 發佈:2020-10-13
結構體簡介
介紹:
Go語言中的基礎資料型別可以表示一些事務的基本屬性,但是我們想表達一個事務的全部或部分屬性時(比如一個人,她的姓名、年齡、愛好等屬性),就無法滿足需求了,Go語言為我們提供了一種自定義資料型別,可以封裝多個基本資料型別,叫結構體,也就是struct
結構體相當於python裡給類傳的引數,python寫法:self.name = name,self.age=age.
結構體
結構體定義
使用type和struct來定義結構體
type 結構體名稱 struct { 欄位名 欄位型別 欄位名 欄位型別 }
其中
1.結構體名稱: 就是自定義結構體的名稱 2.欄位名: 表示結構體的欄位名,結構體欄位必須唯一3.欄位型別: 表示結構體的欄位型別,例如 string int等
舉個例子,我們定義一個名稱為 Person的結構體
type Person struct { name string city string age int }
同樣的欄位型別 還可以寫在一行裡
type Person struct { name , city string age int }
這樣我們就擁有Person的自定義型別,它有name,city,age三個欄位,分別表示姓名、城市、年齡,這樣我們使用Person這個結構體就能很方便的在程式中儲存人的資訊了
結構體例項化
//定義結構體 type Person struct { name , city string age int } func main(){ var p1 Person //例項化結構體 p1.name = "張三" //通過p1訪問結構體的欄位並賦值,例如01.name = "張三" p1.city = "北京" p1.age = 18 fmt.Println(p1) } 結果: {張三 北京 18}
匿名結構體
在定義一些臨時資料結構等場景下還可以使用匿名結構體
func main(){ //定義匿名結構體 varUser struct { Name string Age int } //例項化匿名結構體 User.Name = "李四" User.Age = 18 fmt.Println(User) } 結果 : {李四 18}
對結構體指標 進行例項化
可以取結構體的指標地址進行例項化,那麼p1就是一個 帶指標地址的變數
type Person struct { name , city string age int } func main(){ p1 := &Person{} //取Person的記憶體地址進行例項化 p1.name = "王五" //跟平常的例項化沒有區別,很方便 p1.city = "上海" p1.age = 19 fmt.Println(p1) fmt.Printf("型別為: %T",p1) //列印p1的型別 }
----------------------------結果---------------------------- 結果: &{王五 上海 19} 型別為: *main.Person //代表p1是一個帶指標地址的變數
使用值得列表進行例項化
例項化結構體得時候可以簡寫,也就是說例項化得時候可以不寫Key,只寫Value
type Person struct { name , city string age int } func main(){ p1 := &Person{ "張三", "北京", 20, } fmt.Println(p1) fmt.Printf("型別為: %T",p1) } 結果: --------------------------------結果------------------------ &{張三 北京 20} 型別為: *main.Person
這麼例項化得時候 需要注意:
1.必須例項化結構體得所有欄位
2.例項化得順序必須跟結構體定義得順序一樣
3.該方式不能和平常得 Key/Value例項化 混用
先定義一個結構體, 然後在函式裡 例項化 這個結構體,並返回指標型別的結構體(有的文章稱之為 建構函式)
//定義一個結構體 type person struct { name string city string age int8 } //在函式裡實例化這個結構體,*person代表返回值必須時指標型別,所以必須return &person取出結構體的指標地址進行返回 func newPerson(name, city string, age int8) *person { return &person{ //例項化person這個結構體 name: name, //結構體的name欄位等於函式傳進來的name欄位 city: city, //結構體的city欄位等於函式傳進來的city欄位 age: age, //結構體的age欄位等於函式傳進來的age欄位 } } func main() { p1 := newPerson("張三", "北京", 18) //初始化函式,進行傳參 fmt.Println(p1) } ---------------------結果--------------------------- &{張三 北京 18}
巢狀結構體
一個結構體可以巢狀 另一個結構體或結構體指標
結果:
{張三 19 {河北 唐山}}