Friday, November 19, 2010

golangのsliceコピー

goパッケージのアップデートがどうやら激しいようで、
hg updateかけないと仕様のページ書いてあることも実行でないようです。

今日は、goパッケージのアップデートにより使用可能となりました、
copy(dst, src []T)についてご説明。

go言語の「スライス」がもっと便利になればいいのに!
そう思っていた人も多いはず。

そこで、まずappendが使用可能になりました!
これで使用頻度は5割増しだ。

文法は
append(アペンドされるスライス, アペンドするオブジェクト)でございます。

var a []int{0,1,2}
b := append(a, 3)
// b == []int{0, 1, 2, 3}

次にcopyが可能になりました。
早速スライスをコピーして別のスライスを用意していじって見ましょう。
文法は
copy(コピー先スライス, コピー元スライス)でございます。

【まずは失敗作1】
var a []int{0,1,2}
b := a
edit(a); output(a); output(b)

ぉ、スライスはポインタであるらしいことを忘れていました!
だから、ポインタをコピーしても、元のaとbは同じものを参照しているのです。

【次に失敗作2】
var a []int{0, 1, 2}
b := a
copy(a, b)
edit(a); output(a); output(b)

もちろんこれでもだめ。
bはただのaのコピーロボット。
aの実体が編集されればbも編集されているということ。

【成功例】
var a []int{0, 1, 2}
b := make([]int(len(a))
copy(b, a)
edit(a); output(a); output(b)


これでaとbは違う実体を持つことができる。
これでこそコピー

No comments:

Post a Comment