第 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。