对象:方法集调用

本文探讨了Go语言中方法集的调用,包括基础类型T和指针类型*T的方法集差异。编译器会自动为嵌入类型生成相应的方法,使得类型N和*N具有不同的方法集。通过对方法集的列举和反汇编分析,揭示了Go语言中方法集的生成原理,以及如何保证方法调用的安全性。尽管Go语言没有继承,但编译器的代码补全机制使得方法集的概念得以实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方法集调用

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的话

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值