Go 物件導向之結構體

2022-08-18 18:27:12 字數 2924 閱讀 8119

---說明:  

1. 將一類事物的特性提取出來(比如貓類),形成乙個新的資料型別就是乙個結構體;

2. 通過這個結構體,可以建立多個變數(例項/物件);

3. 事物可以是貓類,也可以是其它的類...;

案例:

package main

import "fmt"

// 定義乙個結構體,類似於類

// 將cat 的各個字段/屬性,放入到結構體中

type cat struct

func main()

---結構體與結構體變數(例項)的區別

1. 結構體是自定義的資料型別,代表一類事物;

2. 結構體變數是具體的,實際的,代表乙個具體的變數;

---##### 結構體變數在記憶體中的布局

##### 如何宣告結構體

基本語法:

type 結構體名稱 struct

例如:

typt person struct

##### 字段屬性

欄位是結構體的組成部分,一般是基本資料型別,陣列,同時也可以是引用型別;

注意事項:

1. 字段宣告語法同變數一樣: 欄位名 字段型別

2. 在建立乙個結構體變數後,如果沒有給字段賦值,每個欄位都對應乙個預設值,引用型別預設值為nil;

3. 不同結構體變數的字段是獨立的,互不影響: 結構體是值型別;

package main

import "fmt"

// 如果結構體裡的字段是引用型別的: slice map channel;

// 在使用前需要make分配記憶體才能使用;

type person struct

type cat struct

func main()

if a1.ptr == nil

if a1.slice == nil

if a1.parents == nil

// 結構體字段是引用型別的話,使用前需要make

a1.slice = make(int,10)

a1.slice[0] = 1

a1.slice[1] = 2

a1.slice[2] = 3

a1.parents = make(map[string]string)

a1.parents["name"] = "aaaa"

a1.parents["friendly"] = "father"

fmt.println(a1) //

// 不同結構體變數間互不影響

var c1 cat

var c2 cat

c1.name = "c1"

c2.name = "c2"

c1.age = 1

c2.age = 2

fmt.println(c1,c2) //

}

---##### 建立結構變數和訪問結構體欄位

package main

import "fmt"

type cat struct

func main()

// 方式2: 字面量方式

var c2 cat = cat

fmt.println(c2) //

// 方式3: 型別推導方式

c3 := cat

fmt.println(c3) //

// 方式4: new 方式

var c4 *cat = new(cat)

c4.name = "c4"

c4.age = 4

fmt.println(*c4)

// 方式5: &{} 方式

var c5 *cat = &cat{}

c5.name = "c5"

c5.age = 5

fmt.println(*c5)

// 方式4,方式5 返回的都是結構體的指標型別

}

1. 第4,5 種方式返回的是***結構體指標***;  

2. 結構體指標訪問欄位的標準方式應該是:(*結構體指標).欄位名, 如:(*c4).name = "c4";

3. go 做了簡化,支援***結構體指標.欄位名***,如:c4.name = "c4",go 編譯器底層自動處理了;

---##### 結構體使用注意事項

1. 結構體中所有的字段在記憶體中是連續的;

2. 結構體是使用者自定義的型別,在和其它型別轉換時需要有完全相同的字段(名稱,個數,型別);

3. 結構體進行type 定義,go 認為是新的資料型別,可以和基本資料型別進行強轉;

4. 結構體每個欄位上可以寫tag,tag 可以通過反射機制獲取,常用的場景是序列化和反序列化;

package main

import (

"encoding/json"

"fmt"

)type person struct

type student struct

type cat struct

func main()

// 輸出的是結構體中tag 定義的名稱

Go物件導向三之結構體方法

一 結構體方法定義 type student struct stu可以看做student的副本,stu就代表student func stu student say string 二 簡單舉例 package main import fmt type personal struct func p p...

15 理解 Go 語言物件導向程式設計 結構體與繼承

我的 github github.com iswbm golangcodingtime 在之前學過的資料型別中,陣列與切片,只能儲存同一型別的變數。若要儲存多個型別的變數,就需要用到結構體,它是將多個容易型別的命令變數組合在一起的聚合資料型別。每個變數都成為該結構體的成員變數。可以理解為 go語言 ...

物件導向之 結構體和類的區別

物件導向之 結構體和類的區別 1.結構體是一種值型別,而類是引用型別。值型別用於儲存資料的值,引用型別用於儲存對實際資料的引用。那麼結構體就是當成值來使用的,類則通過引用來對實際資料操作。2.結構使用棧儲存 stack allocation 而類使用堆儲存 heap allocation 棧的空間相...