Go 的 struct 是一組具名欄位的集合
struct就是把幾個欄位綁成一個型別。Go 沒有 class,struct 加上掛在它身上的方法就是全部。
type Vertex struct {
X int
Y int
}
func main() {
fmt.Println(Vertex{1, 2}) // {1 2}
}同型別的欄位也可以合併寫:X, Y int。
建立與取值
v := Vertex{1, 2} // 位置對應,欄位一多就難讀且怕順序改變
v := Vertex{X: 1, Y: 2} // 具名,實務上一律用這種
v := Vertex{} // 零值:所有欄位各自的 zero value({0 0})
v.X // 用 . 取值
v.X = 10 // 也用 . 賦值指標也用 .,不需要像 C 那樣寫 ->:Go 會自動解參考。
p := &v
p.X = 100 // 等同 (*p).X = 100是值型別
struct 賦值與傳參都是整份複製,跟 slice 不同:
a := Vertex{1, 2}
b := a // 複製一份
b.X = 99 // a.X 還是 1想在函式裡改到原本那個就要傳指標 *Vertex。也因為是值型別,struct 可以直接用相等運算子比較(前提是每個欄位都可比較)。
欄位名的開頭大小寫決定它能不能被別的 package 看到,見 Go 的可見性由開頭字母大小寫決定。