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)来使系统愉悦(也是你愉悦)

猜你喜欢

转载自blog.csdn.net/zhengwish/article/details/87697717