我已经阅读了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
}
切片是一个一开始并不明显的地方。Slice头文件很小,因此复制它的成本很低,并且底层数组是通过指针引用的,因此您可以使用值接收器操作Slice的内容。您可以在sort
包中看到这一点,其中为可排序类型定义的方法没有指针。
唯一需要对切片使用指针的情况是,如果你要操作切片头,这意味着改变长度或容量。对于Append
方法,您需要:
func (p *ByteSlice) Append(data []byte) {
*p = append(*p, data...)
}
关于这个问题有一个常见问题解答:
- 应该在值或指针上定义方法吗?
首先,也是最重要的,方法是否需要修改接收者?如果是,则接收方必须是指针。
…
第二个是对效率的考虑。如果接收对象很大,比如一个大的结构体,那么使用指针接收对象会便宜得多。