Go语言之定义结构体(Struct)-《Go语言实战指南》
结构体(struct)是 Go 中的一种复合数据类型,它允许你将多个不同类型的字段组合成一个类型,类似于 C 语言的结构体或面向对象语言中的类。
️一、结构体的基本定义type结构体名struct{ 字段名 字段类型 ...}️示例:typePersonstruct{ NamestringAgeint}
这里定义了一个 Person 类型,包含两个字段:Name 和 Age。
️二、创建结构体实例
你可以用多种方式创建结构体实例。
️1. 使用字面量(推荐)p := Person{Name:"Alice", Age:30}️2. 指针形式(使用 &)p := &Person{Name:"Bob", Age:25}fmt.Println(p.Name)// 自动解引用,等价于 (*p).Name️3. 使用 new 关键字(不推荐)p :=new(Person)p.Name ="Charlie"p.Age =22
️三、访问与修改字段p := Person{Name:"Dave", Age:40}fmt.Println(p.Name)// 输出:Davep.Age =41fmt.Println(p.Age)// 输出:41
结构体字段是公开(以大写字母开头)还是私有(以小写字母开头)由字段名的首字母决定。
️四、结构体的零值
结构体的零值由每个字段的零值组成:
varp Personfmt.Println(p.Name)// ""fmt.Println(p.Age)// 0
️五、结构体比较(==)
结构体可以直接用 == 比较,但前提是所有字段类型也支持比较。
p1 := Person{"Tom",18}p2 := Person{"Tom",18}fmt.Println(p1 == p2)// true
如果结构体中含有 map、slice、function 等不可比较类型,则不能直接用 ==。
️六、结构体嵌套(组合)typeAddressstruct{ CitystringStatestring}typeEmployeestruct{ NamestringAgeintAddress Address}
使用时:
e := Employee{ Name:"Eva", Age:30, Address: Address{ City:"Beijing", State:"China", },}fmt.Println(e.Address.City)// 输出:Beijing
️七、结构体标签(Tag)
结构体字段可以带标签(如用于 JSON 编码):
typeUserstruct{ IDint`json:"id"`Namestring`json:"name"`}
配合标准库 encoding/json 可用于序列化与反序列化。
️八、小结
- 特性
- 说明
- 定义结构体type StructName struct {}
- 创建实例使用字面量 {},或 new,或 &{}
- 字段访问instance.field 或 ptr.field
- 支持嵌套结构体内可嵌套另一个结构体作为字段
- 支持比较仅当所有字段可比较时可使用 ==
- 可加标签(Tag)用于 JSON、DB 映射等反射相关应用场景