为结构体字段分配新值
在 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 字段,这应该反映在 Print() 方法中。但是,输出显示 x 字段保持不变。
解决方案:使用指针接收器
问题在于 Move( 中使用值接收器) ) 和 Print() 方法。在 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() 和 Print() 方法的指针接收器,我们现在直接对原始 Point 结构进行操作,并且对 x 字段的更改可以正确反映.
以上是为什么在值接收器方法中修改 Go Struct 字段不会改变原始值?的详细内容。更多信息请关注PHP中文网其他相关文章!