我刚刚开始学习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)
如何实现预期的输出?
结构被复制到范围循环中.您需要通过索引访问.
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)