首页 > 后端开发 > Golang > 如何正确修改Go中的结构体字段?

如何正确修改Go中的结构体字段?

Mary-Kate Olsen
发布: 2024-12-17 17:58:10
原创
220 人浏览过

How to Correctly Modify Struct Fields in Go?

Go 中为结构体字段赋值

在 Go 中,结构体通常用来封装相关的数据,并提供一组方法来操纵他们的领域。然而,使用结构体字段时遇到的一个常见问题是正确修改其值。

在下面的示例中,使用两个字段 x 和 dx 创建了一个名为 Point 的结构体。定义了两个方法 Move() 和 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)
}
登录后复制

在 main() 中,创建一个新的 Point 实例,默认值 x=3 和dx=2。调用 Move() 和 Print() 方法,期望 x 字段的值在 Move() 期间发生更改,并且 Print() 输出将反映更新后的值(最终 x=5)。然而,实际输出如下:

2014/07/28 15:49:44 New X=5
2014/07/28 15:49:44 Final X=3
登录后复制

出现这种意外行为是因为这两种方法的接收器都被定义为值接收器(即 Point)而不是指针接收器(*Point)。在 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)
}
登录后复制

通过此修改,Move() 方法可以正确更新 x 字段,并且Print() 方法输出更新后的值。

以上是如何正确修改Go中的结构体字段?的详细内容。更多信息请关注PHP中文网其他相关文章!

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