在 Go 语言中,结构体(struct) 是一种用户定义的复合数据类型,用于将多个不同类型的字段(fields)组合在一起,形成一个逻辑上的整体。结构体是 Go 语言中面向对象编程的基础,可以用来表示复杂的数据结构。
定义结构体
使用 type
和 struct
关键字定义结构体。语法如下:
type 结构体名称 struct { 字段1 字段1类型 字段2 字段2类型 ... }
示例
type Person struct { Name string Age int }
创建结构体实例
可以通过以下几种方式创建结构体实例:
- 直接声明
var p Person p.Name = "Alice" p.Age = 25
- 使用结构体字面量
p := Person{Name: "Bob", Age: 30}
- 省略字段名(按字段顺序初始化)
p := Person{"Charlie", 35}
- 使用
new
关键字(返回指针)p := new(Person) p.Name = "Dave" p.Age = 40
访问结构体字段
使用点号 .
访问结构体的字段:
p := Person{Name: "Alice", Age: 25} fmt.Println(p.Name) // 输出: Alice fmt.Println(p.Age) // 输出: 25
结构体的嵌套
结构体可以嵌套其他结构体,形成更复杂的数据结构。
示例
type Address struct { City string State string } type Person struct { Name string Age int Address Address // 嵌套结构体 } func main() { p := Person{ Name: "Alice", Age: 25, Address: Address{ City: "New York", State: "NY", }, } fmt.Println(p.Address.City) // 输出: New York }
匿名结构体
Go 支持匿名结构体,即不需要定义结构体类型,直接声明并使用。
示例
p := struct { Name string Age int }{ Name: "Alice", Age: 25, } fmt.Println(p.Name) // 输出: Alice
结构体方法
Go 语言中没有类的概念,但可以通过为结构体定义方法来实现类似的行为。方法是一个带有接收者(receiver)的函数。
示例
type Person struct { Name string Age int } // 为 Person 结构体定义一个方法 func (p Person) SayHello() { fmt.Printf("Hello, my name is %s and I am %d years old.\n", p.Name, p.Age) } func main() { p := Person{Name: "Alice", Age: 25} p.SayHello() // 输出: Hello, my name is Alice and I am 25 years old. }
结构体的指针接收者
如果需要在方法中修改结构体的字段,可以使用指针接收者。
示例
func (p *Person) Birthday() { p.Age++ } func main() { p := Person{Name: "Alice", Age: 25} p.Birthday() fmt.Println(p.Age) // 输出: 26 }
结构体的标签(Tag)
结构体的字段可以附加标签(Tag),标签是字符串形式的元数据,通常用于序列化、验证等场景。
示例
type Person struct { Name string `json:"name"` Age int `json:"age"` }
结构体的比较
如果结构体的所有字段都是可比较的(如基本类型、数组、指针等),则结构体本身也是可比较的。
示例
p1 := Person{Name: "Alice", Age: 25} p2 := Person{Name: "Alice", Age: 25} fmt.Println(p1 == p2) // 输出: true
总结
- 结构体是 Go 语言中组织数据的核心工具。
- 结构体可以嵌套、定义方法、附加标签,支持面向对象编程。
- 结构体的字段可以是任意类型,包括切片、数组、
map
、甚至其他结构体。 - 结构体是值类型,传递时会复制整个结构体,如果需要修改原结构体,可以使用指针。