Golang语言规范指出:
任何其他类型 T 的方法集由所有具有接收者类型的方法组成
T
。对应指针类型的方法*T
集是所有带有receiver*T
or的方法的T
集合(即也包含了的方法集T
)。
为什么是这样?为什么接收的方法T
属于设置的方法,*T
反之不属于?
从常见问题解答:
如果接口值包含指针*T,则方法调用可以通过解引用指针来获取值,但如果接口值包含值T,则方法调用没有获得指针的有用方法。
顺便说一句,带有指针接收器的方法可以改变它的接收器,就像它可以改变一个指针参数一样。将非指针接收器作为指针传递(假设这是可能的),允许方法更改它,这不应该。
建议对一个类型的所有方法使用一种一致的接收器类型,并避免混合指针和直接接收器。还建议对大类型使用指针接收器。