Go的值方法接收器与指针方法接收器

ale*_*otc 5 go

我已经阅读了Tour of Go和Effective Go,http://golang.org/doc/effective_go.html#pointers_vs_values,但是仍然很难理解何时使用值方法接收器在结构上定义方法指针方法接收器.换句话说,什么时候会:

type ByteSlice []byte

func (slice ByteSlice) Append(data []byte) []byte {
}
Run Code Online (Sandbox Code Playgroud)

比这更好吗?

func (p *ByteSlice) Append(data []byte) {
    slice := *p
    *p = slice
}
Run Code Online (Sandbox Code Playgroud)

Jim*_*imB 4

切片是一个一开始并不总是明显的地方。Slice 标头很小,因此复制它的成本很低,并且底层数组是通过指针引用的,因此您可以使用值接收器操作切片的内容。您可以在包中看到这一点sort,其中可排序类型的方法是在没有指针的情况下定义的。

唯一需要在切片中使用指针的情况是,如果您要操作切片头,这意味着更改长度或容量。对于Append方法,您需要:

func (p *ByteSlice) Append(data []byte) {
    *p = append(*p, data...)
}
Run Code Online (Sandbox Code Playgroud)