MeWrite Docs

runtime error: index out of range

Goでスライスや配列のインデックスが範囲外の場合に発生するpanicエラー

概要

runtime error: index out of range は、Goでスライスや配列の要素にアクセスする際に、有効範囲外のインデックスを指定した場合に発生するpanicです。

エラーメッセージ

panic: runtime error: index out of range [5] with length 3
panic: runtime error: slice bounds out of range [:5] with capacity 3

原因

1. 存在しないインデックスへのアクセス

1
2
arr := []int{1, 2, 3}
fmt.Println(arr[5]) // panic: index out of range

2. 空のスライスへのアクセス

1
2
var empty []int
fmt.Println(empty[0]) // panic: index out of range

3. 不正なスライス操作

1
2
arr := []int{1, 2, 3}
sub := arr[1:5] // panic: slice bounds out of range

解決策

1. 境界チェックを追加

1
2
3
4
5
6
7
8
arr := []int{1, 2, 3}
index := 5

if index >= 0 && index < len(arr) {
    fmt.Println(arr[index])
} else {
    fmt.Println("インデックスが範囲外です")
}

2. 長さを事前確認

1
2
3
4
5
6
func getFirst(arr []int) (int, error) {
    if len(arr) == 0 {
        return 0, errors.New("スライスが空です")
    }
    return arr[0], nil
}

3. rangeループを使用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
arr := []int{1, 2, 3}

// インデックスを使わない安全なループ
for _, v := range arr {
    fmt.Println(v)
}

// インデックスも必要な場合
for i, v := range arr {
    fmt.Printf("arr[%d] = %d\n", i, v)
}

4. recoverでpanicを捕捉

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
func safeAccess(arr []int, index int) (value int, ok bool) {
    defer func() {
        if r := recover(); r != nil {
            ok = false
        }
    }()
    return arr[index], true
}

// 使用例
arr := []int{1, 2, 3}
if val, ok := safeAccess(arr, 5); ok {
    fmt.Println(val)
} else {
    fmt.Println("アクセスに失敗しました")
}

5. スライス操作を安全に

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
func safeSlice(arr []int, start, end int) []int {
    if start < 0 {
        start = 0
    }
    if end > len(arr) {
        end = len(arr)
    }
    if start > end {
        return []int{}
    }
    return arr[start:end]
}

arr := []int{1, 2, 3}
sub := safeSlice(arr, 1, 10) // [2, 3]

関連エラー

関連エラー

Go の他のエラー

最終更新: 2025-12-17