在 Go 语言中,struct
是一种复合数据类型,用于将多个相关的变量组合成一个单一的类型。以下是一些 struct
的用法案例:
基础用法
定义一个 struct
并创建实例:
gopackage main
import "fmt"
// 定义一个 Person 结构体
type Person struct {
Name string
Age int
City string
}
func main() {
// 创建一个 Person 实例
person := Person{
Name: "Alice",
Age: 28,
City: "Shanghai",
}
// 访问结构体的字段
fmt.Println(person.Name) // 输出: Alice
fmt.Println(person.Age) // 输出: 28
fmt.Println(person.City) // 输出: Shanghai
}
使用字段名初始化
在创建 struct
实例时,可以通过字段名来初始化:
gopackage main
import "fmt"
type Person struct {
Name string
Age int
City string
}
func main() {
// 使用字段名初始化
person := Person{
Name: "Bob",
Age: 25,
}
fmt.Println(person.Name) // 输出: Bob
fmt.Println(person.Age) // 输出: 25
// City 将被初始化为其类型的零值,对于字符串类型是 ""
fmt.Println(person.City) // 输出: (空字符串)
}
嵌入结构体
一个 struct
可以嵌入另一个 struct
:
gopackage main
import "fmt"
type Person struct {
Name string
Age int
}
type Employee struct {
Person // 嵌入 Person 结构体
JobTitle string
}
func main() {
emp := Employee{
Person: Person{
Name: "Carol",
Age: 35,
},
JobTitle: "Engineer",
}
fmt.Println(emp.Name) // 输出: Carol
fmt.Println(emp.Age) // 输出: 35
fmt.Println(emp.JobTitle) // 输出: Engineer
}
方法绑定
为 struct
类型定义方法:
gopackage main
import "fmt"
type Person struct {
Name string
Age int
}
// 为 Person 类型定义一个方法
func (p Person) Introduce() string {
return "Hello, my name is " p.Name " and I am " fmt.Sprint(p.Age) " years old."
}
func main() {
person := Person{
Name: "Dave",
Age: 40,
}
fmt.Println(person.Introduce()) // 输出: Hello, my name is Dave and I am 40 years old.
}
使用指针接收者
定义方法时,可以使用指针作为接收者,这样可以修改原始数据:
代码语言:javascript复制gopackage main
import "fmt"
type Person struct {
Name string
Age int
}
// 使用指针作为接收者
func (p *Person)庆生() {
p.Age // 增加 Age 字段的值
}
func main() {
person := Person{
Name: "Eve",
Age: 30,
}
fmt.Println(person.Age) // 输出: 30
person.庆生() // 调用方法增加年龄
fmt.Println(person.Age) // 输出: 31
}
匿名字段
在 struct
中使用匿名字段:
gopackage main
import "fmt"
type Person struct {
Name string
Age int
}
type Student struct {
Person // 匿名字段
Grade string
}
func main() {
student := Student{
Person: Person{
Name: "Frank",
Age: 20,
},
Grade: "A",
}
fmt.Println(student.Name) // 输出: Frank
fmt.Println(student.Age) // 输出: 20
fmt.Println(student.Grade) // 输出: A
}