通过值接收器修改结构:了解遮蔽效应
在 Go 中,方法接收器的行为会对可变性产生深远的影响结构体。理解值接收器和指针接收器之间的区别对于正确操作结构体至关重要。
问题上下文
提供的示例演示了看似意外的行为。结构体的字段在方法内被修改,但修改不会在方法外持续。
type Test struct { someStrings []string } func (this Test) AddString(s string) { this.someStrings = append(this.someStrings, s) this.Count() // will print "1" } func (this Test) Count() { fmt.Println(len(this.someStrings)) }
执行此代码时,它会打印:
1 0
出现此行为因为 AddString 方法使用值接收器,它本质上是在调用该方法时创建结构的副本。该方法中所做的修改将应用于此副本,而不是原始结构。因此,当在方法外部调用 Count 时,它会在原始的、未修改的结构上进行操作。
指针接收器与值接收器
要解决此问题,可以使用指针必须使用接收器而不是值接收器。指针接收器创建对原始结构的引用,允许直接操作。
func (t *Test) AddString(s string) { t.someStrings = append(t.someStrings, s) t.Count() // will print "1" }
使用指针接收器,AddString 方法直接对接收器的结构进行操作。因此,对 someStrings 的修改反映在原始结构中。因此,当在方法外部调用 Count 时,它会对修改后的结构体进行操作。
结论
通过了解值接收器和指针接收器之间的区别,您可以可以有效地操作Go中的结构体。值接收器创建副本,而指针接收器提供对原始结构的直接访问。这种细微差别对于确保方法内所做的更改在这些方法之外持续存在至关重要。
以上是为什么在值接收器方法中修改 Go 结构的字段不会持续存在?的详细内容。更多信息请关注PHP中文网其他相关文章!