无法修改数组内的struct?

时间:2017-01-17 20:19:46

标签: go

我刚开始学习golang,我有以下代码:

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

package main

import (
    "encoding/json"
    "os"
)

type ResourceUsage struct {
    Type string
}
type Node struct {
    Resources []ResourceUsage
}

func main(){
    encoder := json.NewEncoder(os.Stdout)
    nodes := make([]Node, 2)
    nodes[0] = Node{}
    nodes[1] = Node{}

    for _,n := range nodes {
        n.Resources = append(n.Resources, ResourceUsage{Type: "test"})
    }
    encoder.Encode(nodes)
}

我希望它能打印

[{"Resources":[{"Type:"test"}]},{"Resources":[{"Type:"test"}]}]

但我得到了:

[{"Resources":null},{"Resources":null}]

如何完成预期的输出?

1 个答案:

答案 0 :(得分:7)

结构被复制到范围循环中。您需要通过索引访问。

for i := range nodes {
    nodes[i].Resources = append(nodes[i].Resources, ResourceUsage{Type: "test"})
}

您也可以选择使用不会复制数据的指针。

nodes := make([]*Node, 2)
nodes[0] = &Node{}
nodes[1] = &Node{}

@Kaedys指出,你不能取迭代值的地址。

for _, v := range nodes {
    &v // mistake
}