Go言語の "index out of range" エラーについて
Go言語でプログラミングをしていると、配列やスライスの要素にアクセスする際に "index out of range" というエラーが出ることがあります。
これは、存在しないインデックスを参照しようとしたときに発生します。
今回は、そのようなソースコードの例と、それぞれの対処法を紹介していきましょう。
他のエラーはコチラ
-
【Golang】Go言語でよく発生するエラー一覧8選
Go言語の一般的なエラーとその対処法 これから解説するエラー undefined: [変数名] syntax error: unexpected [トークン], expecting [トークン] re ...
続きを見る
例1:配列の範囲外アクセス
まずは、配列の範囲外にアクセスしようとするコードの例から見ていきましょう。
1 2 3 4 5 6 7 8 |
package main import "fmt" func main() { a := [3]int{1, 2, 3} fmt.Println(a[3]) } |
出力結果
panic: runtime error: index out of range [3] with length 3
ここでは、長さ3の配列 a に対して、存在しないインデックス 3 を参照しようとしています。
インデックスは0から始まるため、配列 a が持つインデックスは0, 1, 2 のみです。
対処法は、参照するインデックスが配列の長さ以下であることを確認することです。
1 2 3 4 5 6 7 8 |
package main import "fmt" func main() { a := [3]int{1, 2, 3} fmt.Println(a[2]) } |
出力結果
3
例2:スライスの範囲外アクセス
次に、スライスの範囲外にアクセスするケースを見ていきましょう。
1 2 3 4 5 6 7 8 |
package main import "fmt" func main() { s := []int{1, 2, 3} fmt.Println(s[3]) } |
出力結果
panic: runtime error: index out of range [3] with length 3
こちらも、長さ3のスライス s に対して、存在しないインデックス 3 を参照しようとしています。
スライスも配列と同様、インデックスは0から始まるため、スライス s が持つインデックスは0, 1, 2 のみです。
このエラーを避けるためには、参照するインデックスがスライスの長さ以下であることを確認することです。
1 2 3 4 5 6 7 8 |
package main import "fmt" func main() { s := []int{1, 2, 3} fmt.Println(s[2]) } |
出力結果
3
例3:空のスライスへのアクセス
空のスライスに対してアクセスしようとすると、同様のエラーが出ます。
1 2 3 4 5 6 7 8 |
package main import "fmt" func main() { s := []int{} fmt.Println(s[0]) } |
出力結果
panic: runtime error: index out of range [0] with length 0
このエラーを避けるためには、スライスが空でないことを確認するか、あるいはアクセスする前にスライスに要素を追加することです。
1 2 3 4 5 6 7 8 |
package main import "fmt" func main() { s := []int{1} fmt.Println(s[0]) } |
出力結果
1
例4:スライスの範囲外へのアサインメント
スライスの範囲外のインデックスに値を代入しようとすると、"index out of range" エラーが発生します。
1 2 3 4 5 6 7 8 9 |
package main import "fmt" func main() { s := []int{1, 2, 3} s[3] = 4 fmt.Println(s) } |
出力結果
panic:runtime error: index out of range [3] with length 3
この例では、長さ3のスライス s の存在しないインデックス 3 に値を代入しようとしています。
このエラーを避けるためには、スライスに要素を追加するときには append 関数を使用することです。
1 2 3 4 5 6 7 8 9 |
package main import "fmt" func main() { s := []int{1, 2, 3} s = append(s, 4) fmt.Println(s) } |
出力結果
[1 2 3 4]
例5:マップに存在しないキーへのアクセス
最後に、マップに存在しないキーへのアクセスを試みるとエラーは発生しませんが、そのキーのゼロ値が返されます。
これは "index out of range" エラーとは異なりますが、意図しない結果を引き起こす可能性があるため、注意が必要です。
1 2 3 4 5 6 7 8 |
package main import "fmt" func main() { m := map[string]int{"one": 1, "two": 2, "three": 3} fmt.Println(m["four"]) } |
出力結果
0
このエラーを避けるためには、マップにキーが存在するかどうかをチェックすることです。
1 2 3 4 5 6 7 8 9 10 11 12 |
package main import "fmt" func main() { m := map[string]int{"one": 1, "two": 2, "three": 3} if val, ok := m["four"]; ok { fmt.Println(val) } else { fmt.Println("Key does not exist.") } } |
出力結果
Key does not exist.
まとめ
以上、Go言語における "index out of range" エラーについて、その発生するソースコードと対処法について見てきました。
インデックスは0から始まるため、それを超えてアクセスしないように注意し、またスライスやマップにアクセスする前には、その要素やキーが存在することを確認することが重要です。
これらのポイントを覚えて、Goのコードを書く際のエラーを少なくしていきましょう!
最後まで読んで頂き、ありがとうございました。少しでもお役にたてたなら幸いです!
他のエラーはコチラ
-
【Golang】Go言語でよく発生するエラー一覧8選
Go言語の一般的なエラーとその対処法 これから解説するエラー undefined: [変数名] syntax error: unexpected [トークン], expecting [トークン] re ...
続きを見る