无法修改数组内的struct?

luc*_*wxp 1 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)
}
Run Code Online (Sandbox Code Playgroud)

我希望它能打印出来

[{"Resources":[{"Type:"test"}]},{"Resources":[{"Type:"test"}]}]
Run Code Online (Sandbox Code Playgroud)

但相反,我得到:

[{"Resources":null},{"Resources":null}]
Run Code Online (Sandbox Code Playgroud)

如何实现预期的输出?

AJc*_*dez 7

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

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

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

nodes := make([]*Node, 2)
nodes[0] = &Node{}
nodes[1] = &Node{}
Run Code Online (Sandbox Code Playgroud)

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

for _, v := range nodes {
    &v // mistake
}
Run Code Online (Sandbox Code Playgroud)

  • 值得注意的是,如果您尝试使用 for 循环获取对象的地址,这也适用。您必须使用索引循环,因为“for _, n := range o”形式将每个索引处的对象复制到单个地址位置。https://play.golang.org/p/jkB85jgVKw (2认同)