结构体(
struct
)是 Go 中的一种复合数据类型,它允许你将多个不同类型的字段组合成一个类型,类似于 C 语言的结构体或面向对象语言中的类。
一、结构体的基本定义
type 结构体名 struct { 字段名 字段类型 ... }
示例:
type Person struct { Name string Age int }
这里定义了一个 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) // 输出:Dave p.Age = 41 fmt.Println(p.Age) // 输出:41
结构体字段是公开(以大写字母开头)还是私有(以小写字母开头)由字段名的首字母决定。
四、结构体的零值
结构体的零值由每个字段的零值组成:
var p Person fmt.Println(p.Name) // "" fmt.Println(p.Age) // 0
五、结构体比较(==)
结构体可以直接用 ==
比较,但前提是所有字段类型也支持比较。
p1 := Person{"Tom", 18} p2 := Person{"Tom", 18} fmt.Println(p1 == p2) // true
如果结构体中含有 map、slice、function 等不可比较类型,则不能直接用 ==
。
六、结构体嵌套(组合)
type Address struct { City string State string } type Employee struct { Name string Age int Address Address }
使用时:
e := Employee{ Name: "Eva", Age: 30, Address: Address{ City: "Beijing", State: "China", }, } fmt.Println(e.Address.City) // 输出:Beijing
七、结构体标签(Tag)
结构体字段可以带标签(如用于 JSON 编码):
type User struct { ID int `json:"id"` Name string `json:"name"` }
配合标准库 encoding/json
可用于序列化与反序列化。
八、小结
特性 | 说明 |
定义结构体 | type StructName struct {} |
创建实例 | 使用字面量 {} ,或 new ,或 &{} |
字段访问 | instance.field 或 ptr.field |
支持嵌套 | 结构体内可嵌套另一个结构体作为字段 |
支持比较 | 仅当所有字段可比较时可使用 == |
可加标签(Tag) | 用于 JSON、DB 映射等反射相关应用场景 |