&的解释

goku := &Saiyan{"Goku", 9001}  //这个不加&也能打印出19001,是为什么呢
goku.Super()
fmt.Println(goku.Power) // 将会打印出 19001
讨论数量: 7
superwen

指针是没有方法的,go语言判断你在一个指针上调用方法,就会智能的调用该指针所对应的对象的方法。

5年前 评论

goku := Saiyan{"Goku", 9001} // 不加&时,调用方法就是跟你理解的调用是一样的:goku.Super()

goku := &Saiyan{"Goku", 9001} // 加&,调用方法时,Go语言会自动处理程以下的调用方式:(*goku).Super()

4年前 评论
go_rookie 11个月前
JaguarJack

隐示调用了

4年前 评论
pardon110

不加&,其实是读引用,写复制。你这里只是读属性,所以加&与否效果一样。

4年前 评论

我也困惑这个问题,但我并不满意以上的答案,不知道是答案是处于个人理解,还是说这是标准答案。我个人觉得是文中给的这段话 在上面的代码中,我们可以这么理解,*Saiyan 类型是 Super 方法的接受者。然后我们可以通过下面的代码去调用 Super 方法:,也就是 goku 才可以调用 Super() 方法,s.Power 表示的就是 Saiyan 的 Power 地址值。我同意 JaguarJack 所说的这里可能是隐示调用了。demo 中添加 &,应该是一种规范,因为函数func (s *Saiyan),表示参数必须是地址

4年前 评论

自动转换成指针调用

package main

import "fmt"

type Saiyan struct {
    Name string
    Power int
}

func (s *Saiyan) Super() {
    s.Power += 10000
    fmt.Printf("%p\n",&s)
}



func main()  {
    var s Saiyan
    fmt.Printf("%p\n",&s)
    s.Super()
}
11个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!