Golang,Go:为什么指针使用星形运算符代替&

7 c pointers go

代码:

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)
}
Run Code Online (Sandbox Code Playgroud)

好吧,我理解为什么以及指针如何工作,但我总是想知道为什么我们使用*operator将指针传递给函数.

  • *ptr 是顺从ptr并返回指针ptr中保存的值.
  • &var 返回变量var的地址.

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

我很迷惑.这个函数不是通过指针吗?

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

PointerType ="*"BaseType.

BaseType =类型.

这也让我感到困惑.为什么我们使用star(*)运算符来获取变量和解引用指针的指针?看起来我们不会&在C和Go中使用这种情况......

ANi*_*sus 13

*in func (p *ByteSlice) Append(data []byte) {只是声明p类型*ByteSlice.

指针的传递发生在这里:

x.Append(y)
Run Code Online (Sandbox Code Playgroud)

正如规范所说(我的重点):

如果方法集x(类型)x包含m并且参数列表可以分配给m的参数列表,则方法调用xm()有效.如果x是可寻址的并且&x的方法集包含m,则xm()是(&x).m()的简写:

在你的情况下,x.Append(y)是一个简写(&x).Append(y).你有你的&-sign.

  • 是.*在声明中用于表示`*ByteSlice`是指向ByteSlice的指针.它也用于取消引用指针(*p).但是,*永远不会用于检索指针; 将用于此. (2认同)