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

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

6.4 Method Values and Expresions

可以将p.Scale赋值给变量,这样可以不用再写接收器。
可以将Point.Scale赋值给变量,则调用时第一个参数要写成接收器的类型。

6.6 Encapsulation

go只能通过字段、函数名、方法名大小写的形式控制是否可见,因此要封装一个对象,需要将它定义成一个结构体。

go中这种基于名字的机制使得封装是基于包级别的,也就说,同一个包中的代码都是可见的。

封装使得调用者只关心暴露的接口,使开发者更方便维护,阻止使用者任意更改内部的稳定性。

获取和修改内部变量名的方法通常为getters和setters,但一般getter方法不用Get前缀来简化命名。

posted @   影随风动91  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示