Golang 第四章 4.结构体
结构体是 一组字段(field)的集合,可以把相关的数据组合在一起。
类似 C 语言的 struct,也类似数据库的一行数据。
定义结构体
type Person struct {
Name string
Age int
}Person 是结构体类型名
Name 和 Age 是字段
每个字段都有 名称和类型
创建结构体实例
方法1:字段名初始化
p := Person{
Name: "Alice",
Age: 30,
}可以只初始化部分字段
未初始化字段 → 零值
p := Person{
Name: "Bob",
}
// Age 默认为 0方法2:按顺序初始化(不推荐,易出错)
p := Person{"Charlie", 25}必须给所有字段赋值
易读性差,不推荐
访问和修改字段
fmt.Println(p.Name) // Alice
p.Age = 31 // 修改字段值指针与结构体
可以使用指针访问字段:
p := &Person{Name: "David", Age: 40}
fmt.Println(p.Name) // Go 会自动解引用
p.Age = 41Go 会自动将 p.Name 转换为 (*p).Name
使用指针可以避免复制整个结构体
嵌套结构体
结构体可以嵌套其他结构体:
type Employee struct {
Person
Salary float64
}嵌套的 Person 字段可以 直接访问其字段:
e := Employee{
Person: Person{Name: "Tom", Age: 50},
Salary: 5000,
}
fmt.Println(e.Name) // 直接访问嵌套字段匿名字段(嵌入类型)
结构体可以嵌入类型而非字段名:
type Address struct {
City string
State string
}
type Person struct {
string // 匿名字段
int // 匿名字段
Address // 嵌套结构体
}匿名字段会提升字段名,可以直接访问
常用于组合(composition)而非继承
结构体零值
所有字段取各自类型的零值
字符串 → ""
int → 0
指针 → nil
切片 → nil
结构体作为函数参数
结构体是 值类型:
func f(p Person) {
p.Age = 100
}
p := Person{Name: "Alice", Age: 30}
f(p)
fmt.Println(p.Age) // 30,原结构体未改变如果想修改原结构体,使用指针:
func f(p *Person) {
p.Age = 100
}
f(&p)
fmt.Println(p.Age) // 100结构体比较
可以使用 == 比较 完全相同类型的结构体
字段值都相等才返回 true
含切片、map、函数字段的结构体 不能直接比较
type Point struct{ X, Y int }
p1 := Point{1, 2}
p2 := Point{1, 2}
fmt.Println(p1 == p2) // true结构体常用场景
组合相关数据
网络消息封装
JSON 映射
配置数据



评论