对象:方法表达式汇编

方法表达式汇编

现在研究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样式
$ disass #看到sub rsp,0x50代表整个栈帧大小是50,f是在38的位置
$ x/xg f #f是一个指针,指向0x000000c42003bf48目标
#0xc42003bf60:    0x000000c42003bf48
$ x/2g 0x000000c42003bf48 #查看地址内容,0x0000000000450b60地址代表.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值