我已经阅读了Go of Go和Effective Go,http://golang.org/doc/effective_go.html#pointers_vs_values,但是仍然很难理解何时使用值方法接收器而不是指针方法接收器在结构上定义方法。换句话说,什么时候会这样:
type ByteSlice []byte
func (slice ByteSlice) Append(data []byte) []byte {
}
比这更好吗?
func (p *ByteSlice) Append(data []byte) {
slice := *p
*p = slice
}
答案 0 :(得分:4)
切片是一开始并不总是显而易见的地方。 Slice标头很小,因此复制它很便宜,底层数组通过指针引用,因此您可以使用值接收器操作切片的内容。您可以在sort
包中看到这一点,其中可以在没有指针的情况下定义可排序类型的方法。
您需要使用带切片的指针的唯一情况是,您是否要操纵切片标头,这意味着更改长度或容量。对于Append
方法,您需要:
func (p *ByteSlice) Append(data []byte) {
*p = append(*p, data...)
}
答案 1 :(得分:2)
有关于此问题的常见问题解答条目:
首先,最重要的是,该方法是否需要修改接收器?如果是,接收器必须是指针。
...
第二个是效率的考虑因素。如果接收器很大,例如一个大的结构,使用指针接收器会便宜得多。