自由気ままにブログ

地方零細企業プログラマがひっそりとなにかしています。

配列に配列を代入はやってはいけない。

f:id:nono138:20200421225921p:plain

こんにちは、こんばんは、138nonoです。

以前、配列に配列を代入すると、両方の配列が値を変換されてしまう問題を紹介したいと思いますが、その原因が分かりました。

↓参考にさせて頂いたページ



どうやら、代入した時点で、値だけでなく、ポインタまで代入してしまい、一見、片方だけ触っているつもりが、両方の変数を触ってしまっていることになります。
見かけ状は変数が2個に見えるが、ポインタが一緒なので、実質的に1個の変数として扱われている状態です。

こちらの対処として、copy関数を使うことで、対策は可能です。
正しい例

package main

import (
    "fmt"
)

func main() {
    var x int
    var y int

    x = append(x, 3)
    x = append(x, 4)
    y = append(y, 5)
    y = append(y, 6)

    fmt.Println(x, y)
    copy(x, y)
    fmt.Println(x, y)
    x[0] = 1
    fmt.Println(x, y)

}


結果
[3 4] [5 6] [5 6] [5 6] [1 6] [5 6]

配列xしか、変わっていないので、成功していますね。

細かい概念の理解がイマイチなので、もっと理解を深めないといけませんね。
現在、GoでPDFを扱う開発をさせて頂いていますが、日本語だとgofpdfが使えないので、なかなか難儀しております。