跳到主要内容

方法声明与接收者

方法声明与 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
}