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中都没有使用&
这个案例......
答案 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。