Golang,Go:为什么指针使用星形运算符而不是&

时间:2014-01-30 09:17:42

标签: c pointers go

code

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是对ptr进行处理并返回保存在指针ptr中的值。
  • &var返回变量var。
  • 的地址

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

我很困惑。这个函数不是通过指针吗?

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

  

PointerType =" *" BaseType。

     

BaseType = Type。

这也让我感到困惑。为什么我们使用star(*)运算符来获取变量和解引用指针的指针?看起来我们在C和Go中都没有使用&这个案例......

1 个答案:

答案 0 :(得分:11)

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

指针的传递发生在这里:

x.Append(y)

正如Specification所说(我的重点):

  

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

在您的情况下,x.Append(y)(&x).Append(y)的简写。你有& -sign。