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中文网其他相关文章!