方法声明

  1. 方法是某种特定类型的函数,面向对象编程就是使用方法来描述每个数据结构的属性和操作,使用者不需要了解对象本身的实现
  2. 方法的声明和普通函数的声明类似,只是在函数名字前面多了一个参数,这个参数把这个方法绑定到这个参数对应的类型上,这个附加参数称为方法的接收者
  3. go语言中,接收者不使用特殊名(this或self),而是自己选择接收者的名字就像其他的参数变量
  4. 由于方法和字段来自于同一个命名空间,因此在一个类型里定义同名的字段和方法会产生冲突,编译器会报错
  5. Go与其他面向对象语言不同,可以将方法绑定到任何类型上,同一个包内的任何类型都可以声明方法,只要它的类型不是指针类型或接口类型
  6. 类型拥有的所有方法名都必须是唯一的,但不同类型可以使用相同的方法名
  7. 由于函数会默认复制每一个实参,因此如果函数需要更新变量或者复制开销太大我们必须使用指针来传递变量的地址,这同样适用于更新接收者,我们将它绑定到指针类型
  8. 命名类型与指向它们的指针类型是为一款可以出现在接收者声明处的类型,为防止混淆,不允许本身是指针的类型进行方法声明
  9. 编译器会对变量p进行&p的隐式转换,只有变量才允许这么做,不能够对一个不能取地址的类型T接收者调用*T方法,因为无法获取临时变量的地址
  10. 如果实参接收者是*T类型,调用T类型的方法永远是正确的,编译器会自动插入一个隐式的*操作符
  11. 任何方法是指针的情况下应该避免复制T的实例,因为这么做可能会破坏内部原本的数据
  12. nil是一个合法的接收者,尤其是当nil是类型中有意义的零值(如map和slice类型)时,当定义一个类型允许nil作为接收者时,应当在文档注释中显式地标明
  13. 我们能够通过某一类型调用其内嵌类型的方法,即使在这个类型没有声明过这个方法的情况下
  14. 内嵌类型的方法是不能访问包含其的类型的,方法只能在命名类型和其指针类型中声明,但是内嵌帮助我们能够在未命名的结构体类型中声明方法