Go入门-方法调用

1.假设有下面的程序,要注意是包container/vector曾经是Go的一部分,但是内建append出现后,就被移除了。然而对于当前的问题并不重要。这个包实现了有push和pop方法的栈结构

package main
import "container/vector"
func main() {
    k1 := vector.IntVector{}
    k2 := &vector.IntVector{}
    k3 := new(vector.IntVector)
    k1.Push(2)
    k2.Push(3)
    k3.Push(4)
}


k1,k2,k3的类型分别是什么?

k1 的类型是vector.IntVector,这里使用了{},因此获得了类型的值

k2是*vector.IntVector,因为获得了复合语句的地址

k2是*vector.IntVector,因为new返回该类型的指针

2. 当前,这个程序可以变异并且运行良好。在不同类型的变量上Push都可以工作。Push的文档这样描述:
func (p* IntVector) Push(x int) Push增加x到向量的末尾
那么接受者应该是 *IntVector类型,为什么上面的代码(Push语句)可以正确工作?above(the Push statements) work correct then?

 

分析题目,我们知道

当x的方法集包含m,并且参数列表可以赋值给m的参数,方法调用x.m()是合法的。如果x可以被地址化,而&x的方法集合包含m,x.m()可以作为(&x).m()的省略写法

解释一下,由于k1可以被地址化,而*vector.IntVector具有Push方法,调用k1.Push(2)被go 转换为(&k1).Push(2)来使系统愉悦(也是你愉悦)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值