乐闻世界logo
搜索文章和话题

Go 中指针接收器和值接收器有什么区别?

4 个月前提问
4 个月前修改
浏览次数18

1个答案

1

在 Go 语言中,当定义类型的方法时,可以选择使用指针接收器(Pointer Receiver)或值接收器(Value Receiver)。这两种方式的主要区别在于如何接收并处理类型的实例。

值接收器(Value Receiver)

使用值接收器时,方法接收的是调用它的变量的一个副本。这意味着方法内部对该数据的任何修改都不会影响原始数据。值接收器适用于:

  • 当方法不需要修改接收器变量的状态时。
  • 当接收器类型是小的值类型,如基本数据类型或小型结构体,这样复制成本较低时。

例子:

go
type Rectangle struct { Length, Width float64 } func (r Rectangle) Area() float64 { return r.Length * r.Width }

在这个例子中,Area 方法使用值接收器,它不需要修改 Rectangle 结构体的任何字段,只是进行读取。

指针接收器(Pointer Receiver)

使用指针接收器时,方法接收的是调用它的变量的内存地址。通过这个地址,方法可以直接访问(并修改)原始变量。指针接收器适用于:

  • 当方法需要修改接收器变量的状态时。
  • 当接收器类型是大的结构体或数组,复制成本高时。
  • 为了保持一致性,当类型中的其他方法已经使用了指针接收器时。

例子:

go
type Rectangle struct { Length, Width float64 } func (r *Rectangle) Scale(s float64) { r.Length *= s r.Width *= s }

在这个例子中,Scale 方法使用指针接收器,因为它需要修改原始 Rectangle 结构体的长度和宽度。

总结

选择值接收器还是指针接收器,主要取决于方法的需求(是否需要修改接收器变量)以及性能考虑(数据结构的大小和复制成本)。一般来说,若需要修改接收者中的数据,或者数据结构较大,推荐使用指针接收器。如果只是读取数据且数据结构较小,使用值接收器即可。

2024年8月7日 18:23 回复

你的答案