19065


Golangであるスライスz = []Hogeを持つ構造体Aがあります。

[code]

    type A struct{
        z []Hoge
    }
    
[/code]

このaの特定要素をAのメソッドBで新たに生成したスライスcにコピーし、それを返します。

[code]

    func (a *A) B()[]Hoge{
        c := make([]Hoge, 2)
        c[0] = a.z[0]
        c[1] = a.z[1]
        return c
    }
    
[/code]

そこでこのcの要素に新たな値を代入するとa.zの要素まで変化してしまいます。おそらく、cがzの参照を持っているのだと思いますが、これを防ぐにはどうすればいいのでしょうか。ちなみにメソッドの*AをAに変えてやってみましたができませんでした。

[code]

    c[0].Huga = "piyo"
    //a.z[0]の要素までpiyoになる
    
[/code]

**追記** :  
上の説明がわかりづらかったので、例を作りました。よろしくお願いします。  
<https://play.golang.org/p/8c6ca441_Z>


CC BY-SA 3.0
2015-11-20T02:45:21.733
19062
2015-11-20T08:04:18.920
2015-11-20T03:16:11.897
7232
7232
question
go
Golangのスライスについて教えて下さい。


<http://play.golang.org/p/dHcl9LNUjc>

全体のコードを見れていないので分かりませんが、文中から起こしたコードだと `a.z[0]` は変わらない様に思います。

**追記**

リーズナブルにやるのであれば、一度 json 化してしまうのも方法です。

<https://play.golang.org/p/XxAzFQIp7w>


CC BY-SA 3.0
2015-11-20T02:52:12.383
19063
2015-11-20T03:40:15.407
2015-11-20T03:40:15.407
440
440
19062
answer


`c[0] = a.z[0]` とした場合、`a.z[0].Huga`(`Buzz` 型構造体)のアドレスが `c[0].Huga`
にセットされてしまいます(shallow copy)。ですので、`Huga`の実体(`Buzz` 型構造体のスライス)もコピーする様にします(deep
copy)。

[code]

    func (a *A) B() []Hoge {
        c := make([]Hoge, len(a.z))
        for i := 0; i < len(a.z); i++ {
            c[i].Huga = make([]Buzz, len(a.z[i].Huga))
            copy(c[i].Huga, a.z[i].Huga)
        }
        return c
    }
    
[/code]


CC BY-SA 3.0
2015-11-20T03:55:32.257
19065
2015-11-20T04:18:18.503
2015-11-20T04:18:18.503
19062
answer


例のHoge, Buzz, Aが structである必要がない(他の要素を持たない)なら、例を

<https://play.golang.org/p/L5eyeKZfCJ>

のように書き換えると理解しやすいと思います。  
以下のコードでどうでしょう。

<https://play.golang.org/p/tve2IHjGG_>


CC BY-SA 3.0
2015-11-20T08:04:18.920
19076
2015-11-20T08:04:18.920
13344
19062
answer