了解结构体的 Setter 行为
本文解决了在 Go 中对结构类型使用 setter 函数时遇到的常见误解。尽管使用了 setter 函数,结构体的值仍然保持不变,而指针 setter 函数成功修改了结构体。
没有指针的 Setters
当按值传递结构体时对于函数,会在函数内创建结构体的副本。因此,对函数内复制的结构体所做的任何修改都不会反映在函数外的原始结构体中。以下代码演示了此行为:
type T struct { Val string } func (t T) SetVal(s string) { t.Val = s }
在此示例中,SetVal 函数被定义为不带指针接收器的 T 方法。当您对结构体 v 调用 SetVal 时,会在函数内创建 v 的副本,并且对副本所做的任何更改都不会影响原始结构体 v。这是因为按值传递值会创建一个全新的对象。
带有指针的 Setters
相反,当使用指针接收器通过引用传递结构体时,该函数接收一个指向该结构体的指针原始结构,允许对函数外部的实际结构进行修改。以下代码说明了此行为:
func (t *T) SetVal2(s string) { (*t).Val = s }
在此示例中,SetVal2 被定义为带有指针接收器的 T 方法。当您对结构体指针调用 SetVal2 时,该函数会收到一个指向原始结构体的指针,并且对函数内结构体所做的任何更改都会影响函数外部的原始结构体。这是因为通过引用传递指针会共享同一个对象的地址。
结论
按值传递结构体和将结构体指针作为结构体传递之间的区别在理解 Go 中结构的 setter 函数的行为时,参数至关重要。通过认识到差异,您可以按预期通过 setter 函数有效地修改结构。
以上是为什么有些 Go Struct Setter 无法修改原始结构?的详细内容。更多信息请关注PHP中文网其他相关文章!