Go 语言中值接收者 (value receiver) 和指针接收者 (pointer receiver) 的区别?

推荐答案

在 Go 语言中,值接收者(value receiver)和指针接收者(pointer receiver)的主要区别在于它们对方法调用时接收者的处理方式:

  • 值接收者:方法接收的是接收者的副本,方法内部对接收者的修改不会影响原始值。
  • 指针接收者:方法接收的是接收者的指针,方法内部对接收者的修改会影响原始值。

本题详细解读

值接收者 (Value Receiver)

值接收者是指在方法定义时,接收者是一个值类型。例如:

在这个例子中,SetValue 方法的接收者是 MyStruct 类型的值。当调用 SetValue 方法时,Go 会创建一个 MyStruct 的副本,并将这个副本传递给方法。因此,方法内部对 m.value 的修改只会影响这个副本,而不会影响原始的 MyStruct 实例。

指针接收者 (Pointer Receiver)

指针接收者是指在方法定义时,接收者是一个指针类型。例如:

在这个例子中,SetValue 方法的接收者是 *MyStruct 类型的指针。当调用 SetValue 方法时,Go 会将 MyStruct 实例的指针传递给方法。因此,方法内部对 m.value 的修改会直接影响原始的 MyStruct 实例。

使用场景

  • 值接收者:适用于不需要修改接收者状态的方法,或者接收者是小型结构体时。
  • 指针接收者:适用于需要修改接收者状态的方法,或者接收者是大型结构体时,以避免复制开销。

示例代码

-- -------------------- ---- -------
------- ----

------ -----

---- -------- ------ -
    ----- ---
-

-- ----
---- -- --------- ------------ ---- -
    ------- - ---
-

-- -----
---- -- ---------- ------------------- ---- -
    ------- - ---
-

---- ------ -
    - -- --------------- ---

    --------------
    -------------------- -- --- --

    ---------------------
    -------------------- -- --- --
-

在这个示例中,SetValue 方法使用值接收者,修改不会影响原始值;而 SetValuePointer 方法使用指针接收者,修改会影响原始值。

纠错
反馈