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 的可見性由開頭字母大小寫決定

相關:Go 的基本型別與預設推斷型別