对象:方法表达式汇编

本文探讨了Go语言中方法表达式如何实现,特别是Method Value的内部机制。方法赋值给变量时,会创建一个包含方法指针和实例的复合结构。在调用时,编译器生成的包装方法会准备参数并调用实际的方法。理解这一过程有助于深入掌握Go语言的方法集、方法值和方法表达式的工作方式。

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

方法表达式汇编

现在研究Method Value究竟怎么实现的?它是怎么持有那两个数据的,另外这两个数据怎么保存下来的?怎么传递的?

type N int

func (n N) Print() {
    println(n)
}

func main() {
    var n N = 100 // instance
    p := &n       // n.pointer

    f := p.Print // *T  = (T + *T)   --> autogen func (n *N) Print

    n++
    println(n, *p)

    f()
}

N有个方法Print,在main方法中先创建N的实例n,获得它的指针p,指针p合法的拥有Print方法,当我们执行f()调用的时候,它怎么拿到p,怎么拿到Print?

编译

$ go build -gcflags "-N -l" -o test test.go
$ gdb test
$ l
$ l
$ b 15
$ b 18
$ r
$ info locals #f看上去是栈上的数据,是个指针
$ p/x f-$rsp #f的偏移量是38,是栈上的
$ set disassembly-flavor intel #设置intel样式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值