0
点赞
收藏
分享

微信扫一扫

go程序设计语言第六章-方法

phpworkerman 2022-01-05 阅读 64

方法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只能是命名类型或者命名类型指针,但接用内嵌结构体,可以摆脱此限制。

举报

相关推荐

0 条评论