Go のスライスの基本(宣言・初期化・要素アクセス)

Go のスライスは、同じ型の要素を連続して格納できる可変長のデータ構造です。配列と似ていますが、サイズを動的に変更できる点が大きな特徴です。

スライスの宣言

スライスを宣言するには、型の前に [] を付けます。宣言しただけの状態では、スライスの値は nil になります。

var numbers []int
fmt.Println(numbers == nil) // true

スライスリテラルで初期化

配列リテラルと似た構文で、初期値を持つスライスを作成できます。

fruits := []string{"apple", "banana", "cherry"}
fmt.Println(fruits) // [apple banana cherry]

配列との違いは、[] の中にサイズを書かない点です。[3]string なら配列、[]string ならスライスになります。

make でスライスを作成

make 関数を使うと、長さと容量を指定してスライスを作成できます。

// make(型, 長さ, 容量)
slice1 := make([]int, 5)    // 長さ5、容量5
slice2 := make([]int, 3, 10) // 長さ3、容量10

長さはスライスに現在含まれる要素数、容量は背後の配列が確保しているサイズです。容量を省略すると、長さと同じ値になります。

要素へのアクセス

スライスの要素には、インデックスを使ってアクセスします。インデックスは 0 から始まります。

colors := []string{"red", "green", "blue"}
fmt.Println(colors[0]) // red
fmt.Println(colors[2]) // blue

colors[1] = "yellow"
fmt.Println(colors) // [red yellow blue]

存在しないインデックスにアクセスすると、実行時にパニックが発生します。

colors := []string{"red", "green", "blue"}
fmt.Println(colors[5]) // panic: index out of range

len で長さを取得

len 関数でスライスの長さ(要素数)を取得できます。

numbers := []int{10, 20, 30, 40}
fmt.Println(len(numbers)) // 4

スライスが nil の場合、len は 0 を返します。これはエラーにならないため、安全に長さをチェックできます。