スライス

Go言語における**スライス(slice)**は、可変長の配列のようなデータ構造であり、Goのプログラムにおいて非常に頻繁に使用されます。スライスは、配列に比べて柔軟性が高く、実用的な用途に適しています。


1. 基本構造と特徴

スライスは以下の3つの情報を持つ構造です:

項目 説明
ポインタ 元となる配列の要素を指す
長さ(length) スライスに含まれる要素数
容量(capacity) スライスの開始位置から元配列の末尾までの最大要素数

スライスは、[]T という形で定義されます(Tは要素の型)。

go
var s []int // int型のスライス(初期化されていない)

2. スライスの作成方法

a. 配列から生成

go
arr := [5]int{1, 2, 3, 4, 5} s := arr[1:4] // 要素2, 3, 4(インデックス1~3)

b. make関数を使用

go
s := make([]int, 3) // 長さ3、容量3のスライス t := make([]int, 3, 5) // 長さ3、容量5のスライス

3. スライスの操作

a. 要素の追加(append)

go
s := []int{1, 2, 3} s = append(s, 4, 5) // 要素4, 5を追加

※ 容量を超えると、新しい内部配列が確保されます(再割り当て)。

b. スライスのコピー(copy)

go
src := []int{1, 2, 3} dst := make([]int, len(src)) copy(dst, src)

4. スライスの部分抽出(スライスのスライス)

go
a := []int{10, 20, 30, 40, 50} b := a[1:4] // [20 30 40]

スライスは元配列とメモリを共有するため、一方を変更すると他方にも影響が出ることに注意が必要です。


5. スライスのゼロ値とnil

go
var s []int // nilスライス(nilであり、長さと容量は0) s2 := []int{} // 空スライス(nilではないが、長さと容量は0)

6. スライスの内部構造(イメージ)

go
array: [1, 2, 3, 4, 5] slice: ^ 長さ = 2 容量 = 3

スライスのlenはアクセス可能な要素数、capはスライス先頭から配列末尾までの長さです。


7. スライスの利点と注意点

利点

  • 可変長で柔軟性が高い

  • appendで簡単に拡張可能

  • 内部で共有メモリを使うため、効率的

注意点

  • 複数のスライスが同じ配列を参照すると、予期せぬ副作用が起きることがある

  • 容量を超えてappendされると、新しい配列が生成され、元のスライスとは切り離される

生成日:2025/05/03