BlogGo言語において固定長のサイズの配列とは別に、要素の追加に応じて自由にサイズを拡張できるスライスという型があります。スライスのデータ構造スライスのデータ構造としては、ソースコードを読んでみるのが早くて、以下のurlにまとまっています。スライスのサイズ}スライスの内部的には、配列のポインタを持っているため、従来の配列と同様の操作が行えます。現在スライスが現在持っている要素数lenをもっていて、要素を追加するたびにこの値が増加していきます。lenとは別に、スライスの宣言時に初期化した要素に応じてcapも決められます。それと同時に、lenとcapをチェックし、capの値を超えたら、古いcapサイズの2倍のサイズのメモリを確保(malloc)し、同じ要素でサイズが2倍のスライスを新たに作ります。このあたりの処理はsliceの内部実装で使われているgrowsliceという関数で実現されています。GitHub読んでみると、スライス拡張の際に新たにメモリサイズを計算し、mallocして新たにメモリが割り当てられていることが理解できると思います。スライスの宣言スライスを使う際に、宣言する方法は配列のものと非常に似ていて、下記のように書くことができます。makeを使ってcapとlenを指定した上で宣言する事もできます。宣言時に[]にサイズを指定する。サイズは指定せず、4つの要素を指定して初期化している。8)スライスの要素の操作スライスは宣言時に自由に要素を指定することができ、指定した要素に応じて長さが決まることを説明しました。このスライスに対して、様々な操作を行うことができます。2]と表示そして、もちろんスライスの特定の要素に対して値を代入することもできます。4]と表示また、別の変数に対して、既に宣言したスライスの参照を渡すことができます。slの特定の要素を変更すると、同じ参照を持つsl2の方でも値が変わっているのを確認できる。上記のように、別の変数に参照を渡すことで、同じ実体を複数の変数から見ることができます。宣言済みのスライスに対して、要素を追加する際にはappend()関数を使って行います。capが4のスライスに対して、appendを行ってみます。appendを行うので、前述したとおり、新たにcapサイズを2倍の8にした上で、5を追加したスライスを返しています。内部的にはmallocをしているので、append前と後では、変数slが指すポインタアドレスは別のものになっています。スライスを使って実装をする上で、スライスのデータ構造、内部実装を理解していないと思わぬバグになりそうなので、ここは非常に注意が必要です。優れた技術専門職になるためのガイド」の内容レビューに関わらせていただきました。4はてなブログをはじめよう!kaktsさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。