方法声明与接收者
方法声明与 receiver 类型有何要求?
- method: 带接收者(receiver)的函数,把操作关联到某个类型;接收者名在函数体中像参数一样使用;
- receiver 类型: 以当前包定义的类型
T或*T为接收者,接收者基类型不能是指针类型或接口类型;
type User struct {
Name string
}
// User 为 receiver 类型;Greet 为 User 的方法
func (u User) Greet() string {
return "hello " + u.Name
}
值接收者有什么特点与使用场景?
- value receiver: 调用时复制 receiver 值;
- 使用场景: 小值类型, 不可变语义;
func (u User) RenameCopy(name string) {
u.Name = name // 修改 receiver 副本,不改变原 User
println(u.Greet()) // hello Bob
}
func main() {
user := User{Name: "Alice"}
user.RenameCopy("Bob")
println(user.Greet()) // hello Alice
}
- 浅复制边界: 值接收者只复制字段本身,若字段是 slice、map 或指针,修改其底层数据仍可能影响原对象;
指针接收者有什么特点与使用场景?
- pointer receiver: 接收指向原值的指针;
- 使用场景: 需要修改 receiver, 大对象避免复制, 保持方法集合一致;
func (u *User) Rename(name string) {
u.Name = name // 通过指针修改原 User
}
func main() {
u := User{Name: "Tom"}
u.Rename("Jerry") // 可寻址值调用指针接收者方法时,编译器可自动取地址
println(u.Greet()) // hello Jerry
}