Go語言學習筆記 - PART7 - 結構體

小羅希冀發表於2019-05-02

定義方式

type identifier struct {
    field1 type1
    field2 type2
    ...
}
複製程式碼

結構體得欄位可以是任何型別,甚至是結構體本身,也可以是函式或者介面

初始化方式

type Point struct { x, y int }
複製程式碼
  • 使用new函式給結構體變數分配記憶體
    Go語言學習筆記 - PART7 - 結構體

new函式獲取到得是結構體型別得指標

  • 獲取結構體型別指標
    Go語言學習筆記 - PART7 - 結構體

使用new函式跟使用&T{}是等價的,都是產生結構體型別指標

  • 獲取結構體型別

    Go語言學習筆記 - PART7 - 結構體

  • 混合字面量語法

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語言學習筆記 - PART7 - 結構體

結構體和它所包含的資料在記憶體中是以連續塊的形式存在的

結構體工廠函式

Go不支援物件導向程式語言中的構造方法,但是可以通過函式實現

type File struct {
    fd      int     // 檔案描述符
    name    string  // 檔名
}

// 定義工廠方法,函式名大寫字母開頭才能被跨包呼叫
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語言的繼承是通過內嵌或組合來實現的

結構體屬性跨包呼叫

結構體的屬性首字母大寫

type TagType struct {
	Field1 bool
	Field2 string
	Field3 int
}
複製程式碼

入門教程推薦: github.com/Unknwon/the…

相關文章