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