首页 >后端开发 >Golang >为什么在值接收器方法中修改 Go Struct 字段不会改变原始值?

为什么在值接收器方法中修改 Go Struct 字段不会改变原始值?

DDD
DDD原创
2024-12-15 17:16:18122浏览

Why Doesn't Modifying a Go Struct Field in a Value Receiver Method Change the Original Value?

为结构体字段分配新值

在 Go 中,处理结构时,理解值接收者与值接收者的概念非常重要指针接收器。值接收器对原始值的副本进行操作,而指针接收器直接对原始值进行操作。

考虑以下代码片段,其中提出了有关意外未更改的结构字段值的问题:

type Point struct {
  x, dx int
}

func (s Point) Move() {
  s.x += s.dx
  log.Printf("New X=%d", s.x)
}

func (s Point) Print() {
  log.Printf("Final X=%d", s.x)
}

func main() {
  st := Point{ 3, 2 };
  st.Move()
  st.Print()
}

期望的是 Move() 方法修改 Point 结构的 x 字段,这应该反映在 Print() 方法中。但是,输出显示 x 字段保持不变。

解决方案:使用指针接收器

问题在于 Move( 中使用值接收器) ) 和 Print() 方法。在 Go 中,一切都是按值传递的,这意味着在将结构体传递给函数时会创建原始值的副本。因此,函数内对副本所做的任何修改都不会影响原始值。

为了解决这个问题,我们需要使用指针接收器。指针接收器允许函数直接对原始值进行操作。这是更正后的代码:

type Point struct {
  x, dx int
}

func (s *Point) Move() {
  s.x += s.dx
  log.Printf("New X=%d", s.x)
}

func (s *Point) Print() {
  log.Printf("Final X=%d", s.x)
}

func main() {
  st := Point{ 3, 2 };
  st.Move()
  st.Print()
}

通过使用 Move() 和 Print() 方法的指针接收器,我们现在直接对原始 Point 结构进行操作,并且对 x 字段的更改可以正确反映.

以上是为什么在值接收器方法中修改 Go Struct 字段不会改变原始值?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn