&的解释
goku := &Saiyan{"Goku", 9001} //这个不加&也能打印出19001,是为什么呢
goku.Super()
fmt.Println(goku.Power) // 将会打印出 19001
指针是没有方法的,go语言判断你在一个指针上调用方法,就会智能的调用该指针所对应的对象的方法。
goku := Saiyan{"Goku", 9001} // 不加&时,调用方法就是跟你理解的调用是一样的:goku.Super()
goku := &Saiyan{"Goku", 9001} // 加&,调用方法时,Go语言会自动处理程以下的调用方式:(*goku).Super()
隐示调用了
不加&,其实是读引用,写复制。你这里只是读属性,所以加&与否效果一样。
我也困惑这个问题,但我并不满意以上的答案,不知道是答案是处于个人理解,还是说这是标准答案。我个人觉得是文中给的这段话
在上面的代码中,我们可以这么理解,*Saiyan 类型是 Super 方法的接受者。然后我们可以通过下面的代码去调用 Super 方法:
,也就是 goku 才可以调用 Super() 方法,s.Power 表示的就是 Saiyan 的 Power 地址值。我同意 JaguarJack 所说的这里可能是隐示调用了。demo 中添加 &,应该是一种规范,因为函数func (s *Saiyan),表示参数必须是地址自动转换成指针调用