首页 > 后端开发 > Golang > 为什么我的Go Struct方法没有修改原始对象?

为什么我的Go Struct方法没有修改原始对象?

DDD
发布: 2024-12-18 15:04:11
原创
839 人浏览过

Why Does My Go Struct Method Not Modify the Original Object?

为结构体字段分配新值

考虑以下场景:Point 类使用 Move() 方法定义,该方法调整 x坐标和 Print() 方法来显示结果。然而,代码表现出意外的行为,在调用 Move() 后显示初始 x 值而不是调整后的 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() 被定义为值接收器这一事实,这意味着它对原始 Point 对象的副本进行操作。因此,在 Move() 中对 s 的修改对实际实例没有影响。

要解决此问题,应将 Move() 方法定义为指针接收器,允许其直接与原始对象交互:

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() 时,s 变量指向原始 Point 对象,因此对 s.x 的更改会直接影响实例。因此,在 Move() 之后调用 Print() 可以正确显示更新的 x 坐标。

以上是为什么我的Go Struct方法没有修改原始对象?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板