Go言語のエラーと例外の基本!初心者がよく出会うエラーとその対処法まとめ
生徒
「Go言語って、エラーが出たときどうやって直すんですか?他の言語だと“例外”って聞いたことあるけど、Goでは違うんですか?」
先生
「いい質問ですね。Go言語では、例外(エクセプション)ではなく“エラー(error)”という仕組みを使って、問題が起きたことを処理します。」
生徒
「なるほど。でも初心者だと、どういうエラーが出やすいのかとか、どう対処すればいいのか分からないです…」
先生
「それでは、Go言語のエラー処理の基本と、初心者がよく出会うエラーとその解決方法について、やさしく説明していきましょう。」
1. Go言語の「エラー」とは?
Go言語では、プログラム中で問題が起きたときに「エラー(error)」という特別な値を使って知らせます。
たとえば、ファイルを開こうとしたときに、そのファイルが存在しなかった場合などにエラーが発生します。エラーが起きても、Go言語ではプログラムが勝手に止まることはなく、自分でエラーをチェックして処理する必要があります。
2. エラーの基本的な書き方と確認方法
Go言語では、関数の戻り値としてエラーを受け取ります。エラーがあるかどうかをif文でチェックして処理します。
次のようなコードで確認できます。
package main
import (
"fmt"
"os"
)
func main() {
file, err := os.Open("sample.txt")
if err != nil {
fmt.Println("エラーが発生しました:", err)
return
}
defer file.Close()
fmt.Println("ファイルを正常に開けました")
}
このコードでは、os.Open関数でファイルを開こうとしています。errにエラーの内容が入るので、それをチェックしてから処理します。
3. 初心者がよく出会うGo言語のエラーとその対処法
Go言語を始めたばかりの人がよく出会うエラーをいくつか紹介し、その意味と対処方法を説明します。
3-1. undefined: 〇〇
undefinedというエラーは、使おうとした変数や関数が定義されていないときに出ます。
undefined: x
これは、「xという名前のものはまだ作っていませんよ」という意味です。
対処法:変数や関数を使う前に、正しく定義しておく必要があります。
3-2. cannot use 〇〇 (type string) as type int
これは、「文字列型(string)の値を、整数型(int)として使おうとしていますよ」という型のエラーです。
cannot use "10" (type string) as type int
対処法:型変換(キャスト)を行う必要があります。例えば、文字列から整数に変換するには、strconv.Atoi関数を使います。
package main
import (
"fmt"
"strconv"
)
func main() {
str := "10"
num, err := strconv.Atoi(str)
if err != nil {
fmt.Println("変換に失敗しました:", err)
return
}
fmt.Println("整数に変換できました:", num)
}
3-3. panic: runtime error
panicとは、Go言語で重大なエラーが発生したときに出るメッセージです。
例えば、配列の範囲外にアクセスしたときなどに起こります。
panic: runtime error: index out of range
対処法:配列やスライスにアクセスする前に、インデックスが範囲内にあるか確認しましょう。
4. Goのエラーは「例外処理」とは違う?
他の言語、例えばJavaやPythonなどでは、tryやcatchという構文を使って「例外処理(エクセプションハンドリング)」を行います。
ですが、Go言語ではこのような仕組みは使わず、「エラーの値を自分でチェックして対応する」という方針をとっています。
このようにすることで、エラー処理が明示的になり、プログラムの動作が分かりやすくなるという利点があります。
5. 独自のエラーを作るには?
Go言語では、自分でエラーを作ることもできます。errors.Newという関数を使って、エラーメッセージを作ります。
package main
import (
"errors"
"fmt"
)
func checkAge(age int) error {
if age < 18 {
return errors.New("18歳未満は登録できません")
}
return nil
}
func main() {
err := checkAge(16)
if err != nil {
fmt.Println("エラー:", err)
return
}
fmt.Println("登録完了です!")
}
このように、年齢チェックなどの場面で自分でエラーを作ることで、より細かい制御が可能になります。
6. エラーが出たらどうすればいい?初心者向けチェックポイント
プログラミング初心者の方がエラーに出会ったとき、どう対応すればよいかのポイントを紹介します。
- エラーメッセージをよく読む:英語の文章でも、どの行でどんな問題があるかを示しています。
- スペルミスをチェック:変数や関数の名前を間違えていないか確認しましょう。
- 型(データの種類)に注意:文字列・整数など、異なる型を混ぜないように気をつけましょう。
- よくある文法ミス:波カッコ
{}やセミコロンが正しく使われているかチェックしましょう。 - ネット検索で調べる:エラーメッセージをコピーして検索するのも効果的です。