---說明:1. 將一類事物的特性提取出來(比如貓類),形成乙個新的資料型別就是乙個結構體;
2. 通過這個結構體,可以建立多個變數(例項/物件);
3. 事物可以是貓類,也可以是其它的類...;
案例:
package mainimport "fmt"
// 定義乙個結構體,類似於類
// 將cat 的各個字段/屬性,放入到結構體中
type cat struct
func main()
---結構體與結構體變數(例項)的區別1. 結構體是自定義的資料型別,代表一類事物;
2. 結構體變數是具體的,實際的,代表乙個具體的變數;
---##### 結構體變數在記憶體中的布局
##### 如何宣告結構體基本語法:
type 結構體名稱 struct
例如:
typt person struct
##### 字段屬性
欄位是結構體的組成部分,一般是基本資料型別,陣列,同時也可以是引用型別;
注意事項:
1. 字段宣告語法同變數一樣: 欄位名 字段型別
2. 在建立乙個結構體變數後,如果沒有給字段賦值,每個欄位都對應乙個預設值,引用型別預設值為nil;
3. 不同結構體變數的字段是獨立的,互不影響: 結構體是值型別;
package mainimport "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 mainimport "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 mainimport (
"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 棧的空間相...