了解结构体类型的 Setter 方法
Go 中的结构体类型提供了一种方便的方法来对相关数据进行分组,而 setter 方法允许我们修改他们的财产。但是,某些情况可能会导致意外行为。
问题描述:
考虑一个带有字段 Val 和两个 setter 函数的结构体 T:SetVal 和 SetVal2。使用 SetVal 不会修改原始结构,而 SetVal2 会修改。理解这种差异至关重要。
底层机制:
将结构体传递给函数时,有两种可能的方法:
推理:
SetVal 将结构体作为值 范围。因此,在函数内创建结构体的副本,对 t(副本)的任何更改都不会影响原始 v。
解决问题:
在 SetVal2 中使用指针接收器方法来确保修改反映在原始版本中结构体:
func (t *T) SetVal(s string) { t.Val = s }
验证:
添加打印语句来演示差异:
type T struct { Val string } func (t T) SetVal(s string) { fmt.Printf("Address of copy is %p\n", &t) } func (t *T) SetVal2(s string) { fmt.Printf("Pointer argument is %p\n", t) } func main() { v := T{"abc"} fmt.Printf("Address of v is %p\n", &v) v.SetVal("pdq") v.SetVal2("xyz") }
此程序输出:
Address of v is 0xf8400cfc00 Address of copy is 0xf8400cfcd0 Pointer argument is 0xf8400cfc00
v 的地址和 SetVal2 中的指针相等,确认了使用原始结构,而 SetVal 适用于副本。
以上是为什么 Go 的 struct setter 方法在使用值与指针接收器时表现不同?的详细内容。更多信息请关注PHP中文网其他相关文章!