在 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) } func main() { st := Point{ 3, 2 }; st.Move() st.Print() }
在此代码中,Move 方法尝试修改Point 结构体的 x 字段,但由于结构体是按值传递的,因此 Move 方法中对结构体所做的更改不会反映在原始结构体中。因此,Print 方法输出 x 的原始值 (3),而不是更新后的值 (5)。
要解决此问题,我们需要将 Point 结构体通过指针传递给 Move 方法。通过指针传递结构体,我们传递了对原始结构体的引用,因此 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 方法可以正确修改 Point 结构体的 x 字段,并且 Print 方法输出更新后的 x 值 (5)。
以上是如何修改 Go 函数中的结构体字段?的详细内容。更多信息请关注PHP中文网其他相关文章!