首页 >后端开发 >Golang >Go 中的指针接收器如何影响函数内的结构修改?

Go 中的指针接收器如何影响函数内的结构修改?

Barbara Streisand
Barbara Streisand原创
2024-12-23 13:10:21519浏览

How Do Pointer Receivers in Go Impact Struct Modification Within Functions?

修改结构体字段值

在 Go 中,当函数接收结构体时,它通常会接收原始对象的副本。因此,对该函数中的结构进行的任何修改都不会影响原始对象。

考虑以下示例,其中我们定义了一个具有两个字段 x 和 dx 的结构 Point。 Move 方法将 x 增加 dx,Print 方法打印 x 的值。

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 结构。这意味着当 st 传递给这些方法时,将创建原始 st 对象的副本。在这些方法中对副本所做的任何修改都不会影响原始 st 对象。

因此,当我们调用 st.Move() 时,st 的副本被修改,但原始 st 对象保持不变。因此,当我们在 st.Print() 中打印 st 时,我们仍然看到 x 的原始值。

要解决这个问题,我们必须修改 Move 和 Print 方法以使用指针接收器而不是值接收器。这确保了对这些方法中的结构所做的任何修改都会影响原始对象。

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()
}

通过使用指针接收器,我们现在得到预期的输出:

2014/07/28 15:49:44 New X=5
2014/07/28 15:49:44 Final X=5

以上是Go 中的指针接收器如何影响函数内的结构修改?的详细内容。更多信息请关注PHP中文网其他相关文章!

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