2017-01-17 17 views
1

私はちょうどgolangを学ぶために始めていると私は次のコードを持っている:私はそれが構造体の内部構造体を変更することはできませんか?

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

を印刷するように期待していたしかし、その代わりに私が手

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":null},{"Resources":null}] 

予想されるouをどのように達成できますかtput?

答えて

5

構造体は範囲ループ内にコピーされます。あなたはインデックスでアクセスする必要があります。

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 
} 
+0

ああ、意味があります。ありがとう:) – lucaswxp

+1

注目に値する、これはあなたがこれまでにforループを使ってオブジェクトのアドレスを取ろうとする場合にも当てはまります。 'for _、n:= range o'形式は、各インデックスのオブジェクトを単一のアドレス位置にコピーするので、インデックスループを使用する必要があります。 https://play.golang.org/p/jkB85jgVKw – Kaedys

関連する問題