Golangのスライスについて教えて下さい。


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>




`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]




`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]

