Golang中为什么使用星号操作符而不是&来使用指针?

11

这是代码

type ByteSlice []byte

func (p *ByteSlice) Append(data []byte) {
  slice := *p
  slice = append(slice, data...)
  *p = slice
}

func main() {
  x := ByteSlice{1, 2, 3}
  y := []byte{4, 5}
  x.Append(y)
  fmt.Println(x)
}

好的,我理解指针为什么和如何工作,但我一直想知道为什么我们要使用*运算符来传递指针到函数。

  • *ptr 是为了解引用指针并返回指针中保存的值。
  • &var 返回变量var的地址。

为什么我们不使用&ByteSlice来传递指向函数的指针呢?

我很困惑。难道这个函数不是在传递指针吗?

根据Go规范(http://golang.org/ref/spec#Pointer_types)

PointerType = "*" BaseType .

BaseType = Type .

这也让我困惑。为什么我们既要用星号(*)运算符获取变量的指针,又要解引用指针?看起来在C和Go中我们都没有使用&...


2
在指针声明中使用 * 而不是 & 源于 C 语言的原则,即声明语法遵循使用方式 - Fred Foo
1个回答

16

func (p *ByteSlice) Append(data []byte) {中的*只是声明p的类型为*ByteSlice

这里发生了一个指针传递:

x.Append(y)
根据规范所说(我强调):
如果方法集(the type of x)包含m,并且参数列表可以分配到m的参数列表中,则方法调用x.m()是有效的 。如果x是可寻址的,并且&x的方法集包含m,则x.m()是(&x).m()的简写。
在您的情况下,x.Append(y)(&x).Append(y)的简写。这就是&符号的含义。

谢谢,我认为我的问题更多涉及C语法。我被符号搞糊涂了,因为它既可以用于解引用指针,又可以用于获取调用变量的指针?符号两种用途都有吗? - user2671513
2
是的。在声明中使用*表示*ByteSlice是一个指向ByteSlice的指针。它也用于解引用指针,(p)。然而,从不用于检索指针; &将被用于此。 - ANisus
“检索”指针是什么意思?您的意思是要检索变量的指针,我们只使用&运算符吗?例如&num? - user2671513
我明白了!"&" 将被用于那个。好的,知道了!现在一切都清楚了! - user2671513
1
没错 :) 。抱歉,我在编辑时添加了最后一句话。很高兴能帮忙! - ANisus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接