7. スライス
- 7.1 スライスとは
- 7.2 スライスの定義
- 7.3 スライス式
- 7.4 スライスの初期化
- 7.5 スライス要素へのアクセス
7.1 スライスとは
スライスは、すべての要素が同じ型の可変長列で、配列の要素の部分列、あるいはすべてを参照します。
スライスは以下の3つから構成されます。
- 配列へのポインタ
参照する領域の、先頭の要素のアドレスをコピーする。
- 要素の長さ
スライスの要素数。
- キャパシティ(容量)
スライスの開始から参照する配列の終わりまでの要素数。
7.2 スライスの定義
スライス型の定義では、「要素の型」を明記します。
[]要素の型 // 例: int型 []int
7.3 スライス式
配列からスライスを作成したり、スライスから新たにスライスを作成することができます。
元の配列またはスライス[下限値:上限値] // 配列arrayのインデックス1~3を参照 // キャパシティは"cap(配列スライスの値)"で調べることが出来る slice := array[1:4] fmt.Println(slice) // “[b c d]”が出力される fmt.Println(cap(slice)) // “4”が表示される // 配列arrayの全体を参照 slice2 := array[:] fmt.Println(slice2) // “[a b c d e]”が出力される fmt.Println(cap(slice2)) // ”5”が表示される // 配列arrayのインデックス2~4を参照 slice3 := array[2:] fmt.Println(slice3) // “[c d e]”が出力される fmt.Println(cap(slice3)) // “3”が表示される // 配列arrayのインデックス0~3を参照 slice4 := array[:4] fmt.Println(slice4) // “[a b c d]”が出力される fmt.Println(cap(slice4)) //”5”が表示される
7.4 スライスの初期化
初期化の方法を2つ紹介します。
make を使う方法
make は組み込み関数で、要素の型、長さ、キャパシティ(容量)を指定し、初期化を行います。
make([]要素の型, 長さ, キャパシティ) make([]要素の型, 長さ)
make を使用するときは、キャパシティを省略することもできます。
その場合、キャパシティは長さと等しくなります。
また、make では初期値を設定することができないため、スライスの要素には指定した型のゼロ値が入ります。
//長さ10, キャパシティ20のスライスを定義する slice1 := make([]int, 10, 20) // 長さ10のスライスを定義する slice2 := make([]int, 10) // 初期値を設定していないので要素はint型のゼロ値が入る // slice1とslice2の長さは同じなので、出力される要素数は同じ fmt.Println(slice1) // “[0 0 0 0 0 0 0 0 0 0]”が出力される fmt.Println(slice2) // “[0 0 0 0 0 0 0 0 0 0]”が出力される // slice2はキャパシティの値を指定していないので、長さと同じ"10"になる // キャパシティは"cap(スライスの値)"で調べることが出来る fmt.Println(cap(slice1)) // “20”が出力される fmt.Println(cap(slice2)) // “10が出力される”
スライスリテラルを使用する方法
要素の型の後ろに {} を付け、初期値を入れます。
[]要素の型{要素の初期, ...} // 例: int型 []int{1, 2, 3}
7.5 スライス要素へのアクセス
配列と同様、スライスは [] を使用して要素にアクセスすることができます。
var s []string{“a”, “b”, “c”} // インデックス0に”zero”を代入します s[0] = “zero” fmt.Println(s) // [zero, b, c]が出力される