是不是说反了,应该是 T 类型接收器的方法会在编译期间生成对应的*T 类型接收器的同名包装方法。
会不会在对应的*T 的包装方法中对原值产生影响,简单写一个测试就能知道,并不会影响,我猜测*T 包装方法内部可能是解引用再调用 T 的方法。
证明:
使用的代码:
package main
type entity struct {
data [2048]byte
v int
}
func (e entity) inc() {
e.v++
}
type incer interface {
inc()
}
func doSomething(i incer) {
i.inc()
}
func main() {
var e = entity{}
doSomething(&e)
}
1. 在 e.v++处设置断点,debug 运行可以断住,说明最终还是调用了 T 的方法
2. 断点时查看函数调用栈,对比 func (e entity) inc()和 func (e *entity) inc()
使用的代码:
package main
type entity struct {
data [2048]byte
v int
}
func (e entity) inc() {
e.v++
}
type incer interface {
inc()
}
func doSomething(i incer) {
i.inc()
}
func main() {
var e = entity{}
doSomething(&e)
}
1. 在 e.v++处设置断点,debug 运行可以断住,说明最终还是调用了 T 的方法
2. 断点时查看函数调用栈,对比 func (e entity) inc()和 func (e *entity) inc()
https://i.imgur.com/paLnYiL.png 可以发现在使用包装方法时的函数栈多出一层