结构体
约 743 字大约 2 分钟
2026-01-18
结构体用于 "自定义数据组合" 通过把多个字段打包成一个类型来描述业务实体、配置、聚合数据或承载方法的接收者。它是 Go 语言中构建复杂数据和面向组合的核心工具
定义一个接结构体使用 type Name struct { ... }
type Human struct {
Age int
Sex bool
Height float32
}提示
字段名要大写才能被其它包访问,且字段在未赋值时采用各自类型的零值
1. 实例化
结构体实例化可以通过四种方式进行
字面量初始化
通过变量承接结构体字面量并同时赋值,如h := Human{Age: 18, Sex: true, Height: 175.5}。字段名写清晰,且无先后顺序问题位置简写
直接写值,如h := Human{18, true, 175.5},但必须完全遵守定义顺序先声明零值再赋值
先拿零值实例var h Human,随后用.语法为字段赋值,如h.Age = 20指针实例化
通过指针的方式得到结构体的引用,如p := &Human{Age: 22}会得到*Human,访问p.Age会自动解引用,修改时直接对同一份数据生效
2. 字段访问与修改
通过点号 . 读取或更新字段
结构体基本使用
package main
import "fmt"
type Human struct {
Age int
Sex bool
Height float32
}
func main() {
h := Human{Age: 12, Sex: true, Height: 154}
fmt.Println("初始:", h)
fmt.Printf("Age is %d \n", h.Age)
fmt.Printf("Height is %.2f \n", h.Height)
fmt.Printf("Sex is %t \n", h.Sex)
h.Age += 1 // 修改字段
p := &h
p.Height = 155.5 // 指针自动解引用
fmt.Printf("修改后: %+v \n", h)
fmt.Printf("%#v\n", h)
}提示
通过 Printf 输出结构体时,可以使用 %v 来按默认格式展示字段值、%+v 输出包含字段名称的内容、%#v 输出 Go 源码的写法把值打印出来
3.匿名结构体
匿名结构体不需要声明一个结构体名称,只需在使用的地方直接通过 struct 声明即可,适合一次性、局部使用的临时数据
匿名结构体
package main
import "fmt"
func main() {
p := struct {
Name string
Age int
}{
Name: "Alice",
Age: 30,
}
fmt.Printf("%+v\n", p)
}4. 结构体嵌套
在结构体中直接嵌入另一个结构体可实现字段与方法提升,常用于复用通用属性
嵌入实现字段提升
package main
import "fmt"
type Human struct {
Age int
Sex bool
}
type Contact struct {
Email string
}
type User struct {
Human // 嵌入,Age/Sex 将被提升
Contact // Email 被提升
Name string
}
func main() {
u := User{
Human: Human{Age: 20, Sex: true},
Contact: Contact{Email: "a@example.com"},
Name: "Bob",
}
fmt.Println(u.Age, u.Email) // 直接访问提升后的字段
u.Age = 21 // 等价于 u.Human.Age = 21
fmt.Println(u.Human.Age, u.Age)
}重要
若多个嵌入类型包含同名字段/方法,访问时会因冲突而需要显式限定,如 u.Human.Age。避免随意堆叠同名字段,否则可读性和可维护性都会降低。