Dev Study
Go コース

21. append とスライスの内部 — 土台配列の共有

スライスに要素を足すには組み込み関数 append を使います。append(s, 値...) は新しいスライスを返すので、s = append(s, x) のように結果を代入し直すのが基本形です。容量(cap)に空きがあれば同じ土台配列に書き込み、空きがなければより大きな配列を新しく確保して全要素をコピーしてから追加します。

ここで注意したいのが土台配列の共有です。cap に余裕があるうちは、元のスライスと append 後のスライスが同じ配列を指すため、片方の変更がもう片方に見えることがあります。逆に cap を超えて再確保が起きると、新しいスライスは別の配列を指すようになり、それ以降は元のスライスと独立します。この境目が見えにくいので、共有を前提にしたコードはバグの温床になりがちです。

下の例では、cap に余裕のあるスライスから切り出して append すると、隣の要素を上書きしてしまう様子を確認できます。意図せぬ共有を避けたいときは、次のレッスンで扱う make と copy を使って独立したスライスを用意します。

▶ サンプルコードを実行してみよう(自由に書き換えてOK)

Go
公式ドキュメントで詳しく ↗