ダッシュで奪取

ゲーム、読書、人生

Goでスライスのディープコピーしたい

スライスからスライスを作った場合、シャローコピーになる

  • pikachu2 の技だけ変更したかったが、pikachu1 の技も変わってしまった
package main
import "fmt"
func main(){
    pikachu1 := []string{"でんきショック", "なきごえ", "しっぽをふる", "でんじは"}
    pikachu2 := pikachu1 // [でんきショック なきごえ しっぽをふる でんじは]

    // pikachu2 に10まんボルトを覚えさせる
    pikachu2[2] = "10まんボルト"

    fmt.Println(pikachu1) // [でんきショック なきごえ 10まんボルト でんじは] <- pikachu1の技も変わってしまった
    fmt.Println(pikachu2) // [でんきショック なきごえ 10まんボルト でんじは]
}

ディープコピーする方法

  • 空スライスの中に、コピー元のスライスを展開する
package main
import "fmt"
func main(){
    pikachu1 := []string{"でんきショック", "なきごえ", "しっぽをふる", "でんじは"}
    pikachu2 := append([]string{}, pikachu1...) // [でんきショック なきごえ しっぽをふる でんじは]

    // pikachu2 に10まんボルトを覚えさせる
    pikachu2[2] = "10まんボルト"

    fmt.Println(pikachu1) // [でんきショック なきごえ しっぽをふる でんじは] <- pikachu1 の技は変わっていない
    fmt.Println(pikachu2) // [でんきショック なきごえ 10まんボルト でんじは]
}

参考URL