V
Vel·ToolKit
简洁 · 高效 · 即开即用
ZH
第 10 章 / 共 20 章

结构体

定义、初始化、嵌入式组合

定义与字面量

package main

import "fmt"

type User struct {
    ID   int
    Name string
    Age  int
}

func main() {
    u1 := User{1, "Alice", 30}
    u2 := User{ID: 2, Name: "Bob"} // 部分字段,省略的取零值
    fmt.Println(u1, u2)
}

字段访问与指针

无论持有的是结构体还是指向结构体的指针,访问字段都用 .,Go 自动解引用。

package main

import "fmt"

type User struct {
    ID   int
    Name string
}

func main() {
    p := &User{Name: "Carol"}
    fmt.Println(p.Name) // 不需要 (*p).Name
}

组合(嵌入字段)

Go 没有继承,但可以嵌入字段实现“组合”。外层结构体可直接调用嵌入结构体的字段与方法。

package main

import "fmt"

type Animal struct{ Name string }

func (a Animal) Greet() { fmt.Println("Hi, I am", a.Name) }

type Dog struct {
    Animal // 嵌入
    Breed  string
}

func main() {
    d := Dog{Animal{"Rex"}, "Husky"}
    d.Greet() // 直接调用 Animal 的方法
    fmt.Println(d.Breed)
}

结构体标签

字段后的反引号字符串是 tag,常用于 JSON、ORM、表单校验等库读取元信息。

package main

import (
    "encoding/json"
    "fmt"
)

type Article struct {
    Title string `json:"title"`
    Body  string `json:"body,omitempty"`
}

func main() {
    b, _ := json.Marshal(Article{Title: "Go"})
    fmt.Println(string(b)) // {"title":"Go"}
}

比较

结构体可比较的前提是所有字段都可比较(含切片、map 的不可比较)。可比较的结构体能作为 map 的 key。