繁体   English   中英

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

[英]Go's value method receiver vs pointer method receiver

我已经阅读了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 {
}

比这更好吗?

func (p *ByteSlice) Append(data []byte) {
    slice := *p
    *p = slice
}

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

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

func (p *ByteSlice) Append(data []byte) {
    *p = append(*p, data...)
}

有关此问题的FAQ条目:

首先 ,最重要的是,该方法是否需要修改接收器? 如果是,接收器必须是指针。

...

其次是效率的考虑。 如果接收器很大,例如一个大的结构,使用指针接收器会便宜得多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM