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

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

Barbara Streisand
发布: 2024-12-23 13:10:21
原创
534 人浏览过

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
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板