为什么追加不适用于切片?

时间:2017-03-17 00:26:21

标签: go

我无法弄清楚为什么以下代码无效:

type Writer interface {
    Write(input []byte) (int, error)
}

type resultReceiver struct {
    body []byte
}

func (rr resultReceiver) Write(input []byte) (int, error) {
    fmt.Printf("received '%s'\n", string(input))
    rr.body = append(rr.body, input...)
    fmt.Printf("rr.body = '%s'\n", string(rr.body))

    return len(input), nil
}

func doWrite(w Writer) {
    w.Write([]byte("foo"))
}

func main() {
    receiver := resultReceiver{}
    doWrite(receiver)
    doWrite(receiver)
    fmt.Printf("result = '%s'\n", string(receiver.body))
}

https://play.golang.org/p/pxbgM8QVYB

我希望收到输出:

received 'foo'
rr.body = 'foo'
received 'foo'
rr.body = 'foofoo'
result = 'foofoo'

相反,它根本没有设置resultReceiver.body

2 个答案:

答案 0 :(得分:1)

您正在尝试更改resultReceiver的基础状态,该状态需要指向结构的指针。你有一个函数而不是一个方法:

https://play.golang.org/p/zsF8mTtWpZ

结帐Steve Fancia关于Go错误的谈话;数字45,功能与方法以及指针与数值分别对您来说是一个很好的复习。

答案 1 :(得分:0)

https://golang.org/doc/effective_go.html#pointers_vs_values

参见Effective Go指针与值

按您的方式,该方法只接收值的副本