Go 的值方法接收者 vs 指针方法接收者

标签 go

我读过 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 header 很小,因此复制它很便宜,底层数组通过指针引用,因此您可以使用值接收器操作 slice 的内容。您可以在 sort 包中看到这一点,其中可排序类型的方法是在没有指针的情况下定义的。

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

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

关于Go 的值方法接收者 vs 指针方法接收者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24960496/

相关文章:

string - 如何找到跳过 N 个字符的子串

java - 在golang os/exec中使用外部库.jar运行Java .class文件

go - VSCODE gopath 不同于 shell 中设置的 GOPATH

go - 如何使用.a文件编译golang程序(无源码)

string - 为什么 utf-8 编码的 byte\xbd 在 for range 循环中被格式化为 unicode 代码点 fffd?

mongodb - 如何通过管道函数获取子字段值

methods - Go:并发调用方法对我不起作用

去风格指南?

amazon-web-services - 没有必需的模块提供包 github.com/aws/aws-sdk-go/aws

arrays - 在 Go 中解码 JSON 数组