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

本文探讨了Go语言中如何为类型添加方法,包括指针接收者与非指针接收者的区别,以及如何通过结构体嵌入实现类型扩展。文章强调了封装的重要性和规则,指出封装可以通过控制字段和方法的访问性来保护对象的内部状态,并提供了方法值和表达式的使用场景。同时,文中提及了nil接收者方法的使用情况和安全性考虑。
摘要由CSDN通过智能技术生成

方法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前缀来简化命名。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值