方法

PPG007 ... 2021-12-26 About 1 min

# 方法

Go 语言中方法总是绑定对象实例,并隐式地将实例作为第一实参。

  • 只能为当前包内命名类型定义方法。
  • 参数 receiver 可任意命名。
  • 参数 receiver 类型可以是 T 或 *T。T 不能是接口或指针。
  • 不支持方法重载,receiver 只是参数签名的组成部分。
  • 可用实例 value 或 pointer 调用全部方法,编译器自动转换。

方法定义格式:

func (接收者变量 接收者类型) 方法名(参数列表) (返回参数) {
  函数体
}
1
2
3
func (u user) getBirthYear() (birthYear int) {
  birthYear = time.Now().Year() - u.age
  return
}

func main() {
  user1 := &user{
    username: "koston",
    password: "123456",
    age:      21,
  }
  fmt.Println(user1.getBirthYear())
}
1
2
3
4
5
6
7
8
9
10
11
12
13

# 指针类型接收者

类似于 this,所有的修改都会生效。

func (u *user) grow(step int) {
  u.age += step
}

func main() {
  user1 := &user{
    username: "koston",
    password: "123456",
    age:      21,
  }
  user1.grow(5)
  fmt.Println(user1.age)
}
1
2
3
4
5
6
7
8
9
10
11
12
13

使用指针接收者的场景:

  • 需要修改接收者中的值。
  • 接收者是拷贝代价比较大的对象。
  • 保证一致性。

# 方法集

方法集规则:

  • 类型 T 方法集包含全部 receiver T 方法。
  • 类型 *T 方法集包含全部 receiver T + *T 方法。
  • 如类型 S 包含匿名字段 T,则 S 和 *S 方法集包含 T 方法。
  • 如类型 S 包含匿名字段 *T,则 S 和 *S 方法集包含 T + *T 方法。
  • 不管嵌入 T 或 *T,*S 方法集总是包含 T + *T 方法。
Last update: December 26, 2021 03:54
Contributors: PPG007