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前缀来简化命名。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南