为结构体字段分配新值
考虑以下场景: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中文网其他相关文章!