定義方式
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 {
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…