go - 无法修改数组内的结构?

标签 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}]

我怎样才能完成预期的输出?

最佳答案

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

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
}

关于go - 无法修改数组内的结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41706212/

相关文章:

go - 如何在 Go 结构中设置默认值

去打印大量

go - Go中使用<img>标签显示本 map 片

c++ - 如何将 CGO 用于具有条件内联函数的头文件?

date - 无法将 "+0000 UTC"解析为 "T"。 Go utc时间解析错误

node.js - 如何进行屏幕录制并实时保存在s3等云存储中

mongodb - 如何使用 mongodb 3.6 中的新 URL 从 golang 连接

go - 使用 golang 代码部署 kubernetes Pod

go - 回溯到更专业的界面

go - 为什么返回 int 的函数文字不能分配给返回 interface{} 的函数?