方法集调用
N类型,有两个方法,当我们用N类型调用的时候,理论上只执行String,但是如果我们用N类型调用Inc是不是合法的呢?
type N int
func (n *N) Inc() {
*n++
}
func (n N) String() string {
return strconv.Itoa(int(n))
}
func main() {
var n N = 100
(*N).Inc(&n)
s := (*N).String(&n)
println(s)
}
$ go build -gcflags "-l" -o test call.go
$ go tool objdump -s "main\.main" test
我们注意到CALL main.(*N).Inc(SB)
调用方式并没有运行期的行为,都是静态绑定。因为调用的哪些方法虽然源码不存在但是编译器生成了,这个方法实际上已经存在了,我们刚刚看到编译器实际上替我们生成了这些间接调用,既然说这个函数或者方法已经存在了,那直接用call间接方法就可以了。
如果A嵌入B,B有个方法叫x,那么编译器会自动帮我们生成A.X方法,方法内部调用A.B.X方法,这实际上是编译器自动生成的。如果我们源码里写A.X的话