函数返回后,数组结构成员上设置的值将丢失

时间:2016-07-01 01:01:56

标签: arrays go pass-by-reference

在golang中,我的理解是数组切片类型是引用。我遇到了一个问题,golang的行为就像复制数据一样,而不是传递引用。

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

type Temp struct {
    Id   string `json:"id"`
    Lost string `json:"lost"`
}

func makeFoo1() []Temp {
    foos := make([]Temp, 0)
    foos = append(foos, Temp{Id: "foo"})
    return foos
}

func makeFoo2() []Temp {
    foos := makeFoo1()
    for _, t := range foos {
        t.Lost = "lost"
    }
    return foos

}

func main() {
    j, _ := json.Marshal(makeFoo2())
    fmt.Printf("%s\n", j)
}

此输出为[{"id":"foo","lost":""}]

如何在makeFoo2中进行作业t.Lost = "..."以便它不会丢失?或者我想真正的问题是如何确保数组是引用而不是值?

1 个答案:

答案 0 :(得分:0)

我自己想出来了 - range返回的实际上是副本。这修好了

func makeFoo2() []Temp {
    foos := makeFoo1()
    for i, _ := range foos {
        foos[i].Lost = "lost"

    }
    return foos

}