1. 程式人生 > 實用技巧 >Go語言學習之結構體

Go語言學習之結構體

結構體簡介

介紹:

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(){
       //定義匿名結構體
    var
User 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 {河北 唐山}}