一、结构体 struct
结构体用于把多个不同类型变量打包成自定义类型,struct 是值类型,赋值、函数传参都会完整拷贝。
- 定义
go
type User struct {
Name string
Age int
}
- 初始化方式
- 字段命名初始化
go
u1 := User{
Name: "zhangsan",
Age: 20,
}
- 顺序简写初始化,严格按照结构体定义顺序赋值,字段调整顺序就会出错
go
u2 := User{"lisi", 22}
- 零值初始化,字段自动填充对应类型零值
go
var u3 User
- 结构体嵌入(组合)
go
type User struct {
Name string
Age int
}
type Student struct {
User
Score float64
}
Student 直接嵌入 User,可直接访问 Name、Age,Go 推荐用组合替代继承。
二、方法 method
方法本质是带接收者的函数,接收者写在 func 和函数名之间,绑定到结构体。接收者分两类:值接收者、指针接收者。
1. 值接收者
go
func (u User) ChangeName(newName string) {
u.Name = newName
}
- 传递的是结构体拷贝副本
- 方法内部修改字段,只会修改副本,外部原结构体数据不变
go
u := User{Name: "zhangsan", Age: 20}
u.ChangeName("wangwu")
fmt.Println(u.Name) // zhangsan,没有变化
2. 指针接收者
go
func (u *User) ChangeName(newName string) {
u.Name = newName
}
- 拿到原始结构体内存地址,没有完整拷贝
- 方法内修改字段,直接改动外部原始结构体
go
u := User{Name: "zhangsan", Age: 20}
u.ChangeName("wangwu")
fmt.Println(u.Name) // wangwu,修改生效
三、指针
*T 代表T类型指针,存储变量内存地址;& 用来获取变量地址。
go
u := User{"test", 18}
pu := &u // pu保存u的内存地址
fmt.Println(pu.Name) // Go自动解引用,可直接访问结构体字段