T和*T的方法集

Mat*_*ner 1 methods interface go receiver

Golang语言规范状态:

任何其他类型T的方法集由具有接收器类型的所有方法组成T.设置相应的指针型的方法*T是该组的与接收机的所有方法*TT(即,它也包含的方法集T).

为什么是这样?为什么接收方法T属于方法集*T但反之亦然?

Mos*_*afa 6

来自FAQ:

如果接口值包含指针*T,则方法调用可以通过取消引用指针来获取值,但是如果接口值包含值T,则方法调用没有用于获取指针的有用方法.

顺便说一下,指针接收器的方法可以改变它的接收器,就像它可以改变指针参数一样.将非指针接收器作为指针接收器(假设这是可能的),允许该方法改变它,而不应该改变它.

建议对所有类型的方法使用一种一致的接收器类型,并避免混合指针和直接接收器.还建议对大型使用指针接收器.