Go語言學習筆記 - PART7 - 結構體
type identifier struct { field1 type1 field2 type2 ... } 複製程式碼
結構體得欄位可以是任何型別,甚至是結構體本身,也可以是函式或者介面
初始化方式
type Point struct { x, y int } 複製程式碼
- 使用new函式給結構體變數分配記憶體
new函式獲取到得是結構體型別得指標
- 獲取結構體型別指標
使用new函式跟使用&T{}是等價的,都是產生結構體型別指標
-
獲取結構體型別
-
混合字面量語法
point1 := Point{0, 3}(A) point2 := Point{x:5, y:1}(B) point3 := Point{y:5}(C) 複製程式碼
結構體的型別定義在它的包中必須是唯一的,結構體的完全型別名是:packagename.structname
點號選擇器
- 點號選擇器可以給結構體的欄位賦值
point.x = 5 複製程式碼
- 點號選擇器可以獲取結構體欄位的值
x := point.x 複製程式碼
- 無論是結構體型別還是結構體型別指標,都可以使用點號來引用結構體欄位
type myStruct struct { i int } var v myStruct// v是結構體型別變數 var p *myStruct// p是指向一個結構體型別變數的指標 複製程式碼
記憶體佈局

結構體和它所包含的資料在記憶體中是以連續塊的形式存在的
結構體工廠函式
Go不支援面向物件程式語言中的構造方法,但是可以通過函式實現
type File struct { fdint// 檔案描述符 namestring// 檔名 } // 定義工廠方法,函式名大寫字母開頭才能被跨包呼叫 func NewFile(fd int, name string) *File { if fd < 0 { return nil } return &File{fd, name} } // 呼叫工廠方法 f := NewFile(10, "./test.txt") 複製程式碼
如果想要強制使用工廠函式,那麼可以將結構體的型別改為首字母小寫
結構體的標籤
結構體中的欄位,除了名字和型別,還有一個可選的標籤,它是附屬在欄位的字串(相當於欄位的解釋)
- 標籤的內容需要通過反射獲取
type TagType struct { // tags field1 bool"An important answer" field2 string "The name of the thing" field3 int"How much there are" } func main() { tt := TagType{true, "Barak Obama", 1} for i := 0; i < 3; i++ { refTag(tt, i) } } func refTag(tt TagType, ix int) { // 使用reflect包 ttType := reflect.TypeOf(tt) ixField := ttType.Field(ix) fmt.Printf("%v\n", ixField.Tag) } 複製程式碼
匿名欄位和內嵌結構體
- 結構體可以包含一個或多個匿名欄位,此時欄位的型別就是欄位的名稱
// 欄位名稱分別是:bool, string, int type TagType struct { bool string int } 複製程式碼
在結構體中,對於每種資料型別,只能有一個匿名欄位
- 匿名欄位本身也可以是一個結構體型別
Go語言的繼承是通過內嵌或組合來實現的