我试图了解为什么以下测试代码无法按预期工作:
package main import ( "fmt" "strings" ) 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)) } func main() { var test Test test.AddString("testing") test.Count() // will print "0" }
这将打印:
"1" "0"
意思someStrings是显然被修改了……然后就没有了。
someStrings
有人知道这可能是什么问题吗?
AddString方法正在使用值(副本)接收器。修改是针对副本,而不是原始文档。必须使用指针接收器来改变原始实体:
package main import ( "fmt" ) type Test struct { someStrings []string } func (t *Test) AddString(s string) { t.someStrings = append(t.someStrings, s) t.Count() // will print "1" } func (t Test) Count() { fmt.Println(len(t.someStrings)) } func main() { var test Test test.AddString("testing") test.Count() // will print "0" }
操场
输出量
1 1