方法method
receiver p
selector 形如p.X或p.Path()
go可以让任意类型添加方法,可以为一个named type添加方法,只要它的底层不是指针或接口。
当receiver为指针类型时,实例类型调用方法会自动取地址然后调用,
这仅限于变量,包括结构体成员,数组成员,slice成员(因为他们都是可寻址的)。
当类型T的所有方法的receiver都是T实例而不是指针时,复制此类型实例是安全的。
调用它的任何一个方法都是做一个复制。例如time.Duration。
但是如果方法中的receiver是一个指针,则避免复制实例,因为那样那破坏他的内部不变性。
例如复制bytes.Buffer将会导致副本和原来指定同一个底层的byte arry。随后的方法调用将产生
不可预估的影响。
就像有些函数允许nil指针作为参数,有些方法也允许nil作为receiver,尤其是nil代表此类型的零值时,
例如map和slice。当方法允许nil作为receiver时,应当在文档中标识它的含义。
6.3 Composing Types by Struct Embedding
通过嵌入结构体扩展类型
type Point struct{ X, Y float64 }
type ColoredPoint struct {
Point
Color color.RGBA
}
ColoredPoint结构体自动有用字段Point的方法。
结构体中的匿名字段,有可能是某个类型的指针类型,则此字段名称和方法将自动从指向对象获取。
当结构体有多个匿名字段,则此结构体的值除了拥有直接定义在它本身类型上的方法,还拥有各字段的方法。
当形如p.ScaleBy调用时,它先找此结构体直接声明的方法,然后找内嵌类型的方法,然后找内嵌类型的内嵌类型的方法。。。
方法的receiver只能是命名类型或者命名类型指针,但接用内嵌结构体,可以摆脱此限制。