一尘不染

为什么通过方法对结构所做的更改不持久?

go

我试图了解为什么以下测试代码无法按预期工作:

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是显然被修改了……然后就没有了。

有人知道这可能是什么问题吗?


阅读 185

收藏
2020-07-02

共1个答案

一尘不染

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
2020-07-02