修改结构体字段值
在 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中文网其他相关文章!