👋
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