👋

GoのSliceは、Arrayのpointerとlength&capを持つ

に公開

ArrayとSliceは別物

arrayは、文字通り配列で、実データを保存している。
複数の要素が、メモリ内に隣同士に配置されている。
2 byteの数字のarrayを例にすると、メモリアドレスは次のようになっているイメージ。

0x1000
0x1002
0x1004

一方のsliceは、いわばarrayの代表(representation)。
arrayを関数に渡したい時とかに、全部コピーしてたら大変なので、
arrayのpointerを渡すのが良い。
これをしてくれるのがslice。

sliceは、3つの値しか持たない。

  • pointer at an array
  • size of this array
  • capacity of this array

sliceを初期化するとき、内部では、arrayとsliceの両方が作成されている。

sliceは、いわばarray専用のpointerということができる。
sliceがどのarrayもpointしていないとき、それはnilになる。

sliceにとってのゼロ値は、空のarrayを内部参照している状態

s := make([]int, 0, 0)

sliceにとってのnilは、arrayを参照していない状態(この場合、lenとcapにはそれぞれ0が入る)

var s []int

これはnil sliceとなる。

Discussion