電波ビーチ

☆(ゝω・)v

Sliceをコピーするときcopyじゃなくてappendを使うとなにも考えずに済む

Goでスライスをコピーする関数があります。

func copy(dst, src []Type) int

戻り値は「コピーが成功した要素の数」です。

注意点として、dstsrcの長さが短いほうのぶんだけしかコピーされません。なので、

arr := []int{1, 2, 3}
tmp := []int{}
copy(tmp, arr)

は、len(tmp) == 0なので、最大コピー数は0、つまりコピーなんてされません。

fmt.Println(tmp)    //    []
fmt.Println(arr)    //    [1 2 3]

解決策として、予めコピー元のサイズを求めてmakeしておく手がありますが、書くのめんどくせぇです。

// あらかじめサイズを確保して作っておく
tmp := make([]int, len(arr))
copy(tmp, arr)

愚直です。

空のスライスにコピー元をまるごとappendで追加したやつが1行も短く書けます。

tmp := append([]int{}, arr...)

速度とかは知りません。