カテゴリ: Go言語 更新日: 2026/02/27

Go言語のエラーハンドリングの基本!error型を理解しよう

Go言語のエラーハンドリングの基本!error型を理解しよう
Go言語のエラーハンドリングの基本!error型を理解しよう

先生と生徒の会話形式で理解しよう

生徒

「先生、Go言語でプログラムを書くときにエラーが出たらどうすればいいんですか?何か特別な決まりとかありますか?」

先生

「Go言語ではエラーハンドリング、つまりエラー処理がとても大事です。Goの特徴として、error型という特別な型を使ってエラーを扱います。」

生徒

「error型って何ですか?難しそうですね…」

先生

「安心してください。error型はエラーが起きたかどうかを教えてくれるメッセージのようなものです。今日はこのerror型の基本と、エラーをどう扱うかをゆっくり解説しますね。」

1. エラーハンドリングとは?

1. エラーハンドリングとは?
1. エラーハンドリングとは?

エラーハンドリングは、プログラムで「想定外」や「失敗」が起きたときに安全に対処するための決まりごとです。ファイルが見つからない、ネットワークが切れた、入力が不正だった――こうした外部要因は避けられません。そこで、失敗を検知し、知らせ、必要ならやさしく中断したり代替案に切り替えるのがエラーハンドリングの役目です。

ポイントは「止めるべきときに止め、続けられるなら続ける」こと。ユーザーへのメッセージ、ログへの記録、後続処理のスキップなどを通じて、データ破損や予期せぬクラッシュを避けます。Go言語でも、この考え方は同じです。

まずは雰囲気をつかむミニサンプル(初心者向け)


package main

import (
    "fmt"
    "os"
)

func main() {
    // わざと存在しないファイル名を開こうとする
    f, err := os.Open("data.txt")
    if err != nil {
        // 失敗を検知:ユーザーに分かる言葉で知らせて、処理をやめる
        fmt.Println("ファイルを開けませんでした。名前や場所を確認してください。")
        return
    }
    // ここに来られたら成功。後片付けを忘れない
    defer f.Close()

    fmt.Println("ファイルを開けたので、ここから先の処理を続けます。")
}

解説:os.Openで処理を試す → ②失敗したらメッセージを出して終了 → ③成功したら次の処理へ進む。このように「失敗したらどうするか」を先に決めておくと、プログラムは安定します。

この段階では「問題が起きるかもしれない前提で、まず確かめる」習慣を身につけましょう。次の章では、Go言語で広く使われるerrorという仕組みを使って、より具体的に失敗を扱う方法を見ていきます。

2. Go言語のerror型とは?

2. Go言語のerror型とは?
2. Go言語のerror型とは?

error型は、Go言語で「うまくいかなかった理由」を表すための特別な型です。中身は人間が読める短いメッセージで、失敗の事実とその理由をひとまとめに伝える札のような役割を持ちます。実体はインターフェースですが、まずは「失敗を入れて渡す箱」と考えれば十分です。

大切なのは値があるかどうかです。エラーが無ければ値はnil(空っぽ)になり、エラーがあればnilではなくなります。つまり、err == nilかどうかを見るだけで「今、失敗しているか」を判定できます。これはGoのエラーハンドリングの基礎にあたる考え方です。

ミニサンプル:errorは「ある/ない」を確かめる印


package main

import (
    "errors"
    "fmt"
)

func main() {
    var err error           // まだ何も起きていない => nil
    fmt.Println("今はエラーなし?", err == nil)

    // 失敗が起きた想定で、エラーメッセージを作る
    err = errors.New("読み込みに失敗しました")

    // err が nil でなければ、何かが失敗している
    if err != nil {
        fmt.Println("エラー内容:", err.Error())
    }

    // 問題が解消されたら、err を nil に戻せる
    err = nil
    fmt.Println("エラーは解消された?", err == nil)
}

解説:var err errorの初期値はnilです。errors.Newでエラーを作るとerrが「空ではなくなる」ため、err != nilが真になります。メッセージはerr.Error()で取り出せます。失敗が解消されたらerr = nilに戻すと「今は問題なし」という状態を表現できます。

このようにerror型は「メッセージを持つ失敗の印」。まずはnilかどうかで状態を確認する、という発想を押さえておきましょう。

3. error型を使った基本的なエラー処理の書き方

3. error型を使った基本的なエラー処理の書き方
3. error型を使った基本的なエラー処理の書き方

Goでは関数が処理結果と一緒にerrorを返すことが多いです。エラーが起きているかどうかを確認して、起きていたら適切に処理します。


package main

import (
    "errors"
    "fmt"
)

// エラーを返す関数の例
func divide(a, b int) (int, error) {
    if b == 0 {
        return 0, errors.New("0で割ることはできません")
    }
    return a / b, nil
}

func main() {
    result, err := divide(10, 0) // 0で割ろうとしている
    if err != nil {
        fmt.Println("エラー:", err)
        return
    }
    fmt.Println("結果:", result)
}

このコードでは、divide関数が割り算の結果とエラーを返しています。割る数が0の場合はエラーを返し、それ以外は計算結果を返します。main関数でエラーがないかチェックし、あればエラーメッセージを表示します。

4. nilとは?

4. nilとは?
4. nilとは?

nilは「何もない」ことを示す特別な値です。error型の場合はエラーがない状態を表します。なので、if err != nilという条件は「エラーがあるかどうか」を調べています。

5. よくあるエラーハンドリングのパターン

5. よくあるエラーハンドリングのパターン
5. よくあるエラーハンドリングのパターン

多くのGoプログラムでは、関数がエラーを返したらすぐに処理をやめるか、エラー内容をログに書いて次の処理を考えます。基本は以下の流れです。

  • 関数がerrorを返す
  • 戻り値のerrorをチェックする
  • エラーなら処理を中断したり、ログを出したりする
  • エラーがなければ正常な処理を続ける

このパターンを守ることで、予期しない問題に強いプログラムが作れます。

6. エラーの作り方とカスタマイズ

6. エラーの作り方とカスタマイズ
6. エラーの作り方とカスタマイズ

先ほどの例では errors.New で簡単にエラーを作りましたが、より詳しい情報を含んだエラーを自分で作ることもできます。


package main

import (
    "fmt"
)

// 独自のエラー型を作る
type MyError struct {
    Msg string
}

func (e *MyError) Error() string {
    return e.Msg
}

func doSomething(flag bool) error {
    if !flag {
        return &MyError{Msg: "処理に失敗しました"}
    }
    return nil
}

func main() {
    err := doSomething(false)
    if err != nil {
        fmt.Println("エラー発生:", err)
    }
}

このように自分だけのエラー情報を持った型を作ることもでき、状況に応じて細かいエラーの扱いができます。

7. まとめないですが重要なポイント

7. まとめないですが重要なポイント
7. まとめないですが重要なポイント
  • Goのエラーはerror型で表現される
  • 関数の戻り値でエラーを返すのが基本のやり方
  • nilでないエラーは必ずチェックして対応する
  • エラーを作るときはerrors.Newや独自の型を使える
  • エラーハンドリングはプログラムの安定性を高める重要な技術

8. エラーを怖がらず使いこなそう

8. エラーを怖がらず使いこなそう
8. エラーを怖がらず使いこなそう

エラー処理は初心者には難しいと思われがちですが、Go言語のerror型はシンプルで扱いやすい仕組みです。まずはエラーを返す関数を呼び出して、エラーの有無をチェックする基本をしっかり身につけましょう。慣れてくると、より安全で安心できるプログラムが書けるようになりますよ。

まとめ

まとめ
まとめ

Go言語のエラーハンドリングは、初心者でも理解しやすい構文でありながら、実際の開発現場でも非常に重要な仕組みです。プログラムが正常に動く状況だけではなく、予期しない問題が起きたときに落ち着いて対応できるかどうかが、安定したアプリケーションを作る大切なポイントになります。特に、ファイル操作やネットワーク通信、データベースの処理など、外部と関わる処理ではエラーが発生しやすく、Go言語のerror型が本領を発揮します。エラーが返ってきたときにnilと比較する書き方は最初は独特に見えるかもしれませんが、慣れてしまえば自然に書けるようになります。

また、Go言語には独自のエラー型を定義できる柔軟さがあり、エラーの内容をより詳しく伝えたい場面にも対応できます。独自エラー型を使えば、「どこで失敗したのか」「どんな原因で処理が止まったのか」といった情報を細かく持たせられるため、ログ管理やデバッグにも役立ちます。WebアプリケーションやAPIを作るときには、ユーザーに返すメッセージを整理したり、内部処理ログを分かりやすく管理したりと、エラー処理は運用面でも欠かせない存在です。

さらに、Go言語ではエラーが発生した時点で処理をやめるだけではなく、条件に応じて別の処理へ流したり、エラー内容を画面表示したり、ログファイルに保存したりと柔軟な動きができます。つまり、エラーを正しく扱えば、壊れにくいプログラム、予測可能なプログラム、信頼できるプログラムに近づいていきます。現場では、複数の関数が連続して呼ばれるとき、それぞれでerrorチェックが行われ、途中で問題があれば無理に続けず安全に停止させます。この積み重ねが、後から見ても読みやすく、修正しやすいコードを生み出します。

そして最後に、エラーハンドリングは「つい書き忘れてしまう」「動いているから大丈夫」と考えがちな部分ですが、しっかり理解すれば必ず役に立ちます。エラーのないプログラムは存在しません。だからこそ、エラーと向き合い、処理を工夫し、アプリケーションを守ることが大切です。Go言語は簡潔な文法でありながら、エラーを扱う機能がとても強力ですので、少しずつコードを書きながら身につけていきましょう。

サンプルプログラムでもう一度復習

ここでは、ファイルを開く処理でエラーが出た場合にどうするか、簡単なコードで振り返ります。


// ファイルを開くサンプル
package main

import (
    "fmt"
    "os"
)

func main() {
    file, err := os.Open("data.txt")
    if err != nil {
        fmt.Println("ファイルを開けませんでした:", err)
        return
    }
    defer file.Close()
    fmt.Println("ファイルを正常に開くことができました")
}

この例では、ファイルが存在しなかったり、権限の問題で開けなかったりする場合にerrに値が入ります。もしnilでなければ、エラーメッセージを表示して終了します。逆に正常に開けた場合はdefer file.Close()でファイルを閉じつつ処理が進みます。こうした丁寧なエラー処理が積み重なることで、安全で動作の安定したアプリケーションになります。

プログラムは常に理想通り動くわけではなく、思わぬデータや入力ミス、外部環境の変化によってエラーを出すことがあります。そうしたときに必要なのがエラーハンドリングです。「とりあえず動けばいい」ではなく、「問題が起きても落ち着いて処理する」姿勢を持つことで、開発者としてのスキルも大きく成長します。ぜひ、エラーを見るたびに落ち込むのではなく、次の改善ポイントが見つかったと前向きにとらえてみてください。

先生と生徒の振り返り会話

生徒

「先生、エラーってできれば出したくないって思っていましたけど、ちゃんと向き合うことが大事なんですね。」

先生

「その通りです。エラーは悪者ではなく、プログラムの問題を教えてくれる大切な味方ですよ。」

生徒

nilerrの比較も最初は不思議でしたけど、慣れると分かりやすいですね。」

先生

「エラー型を自分で作れるのも便利ですよ。システムが大きくなるほど、細かい情報が役に立ちます。」

生徒

「これからエラーが出ても、落ち着いて原因を見るようにします!」

Go言語を基礎からスッキリ学びたい人や、 文法だけでなく「実用的な使い方」まで押さえたい人には、 定番の入門書がこちらです。

基礎からわかるGo言語をAmazonで見る

※ Amazon広告リンク

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

Go言語でエラーハンドリングは何のために必要なのですか?普通に動いていれば気にしなくてもいいのですか?

Go言語でエラーハンドリングが必要なのは、プログラムがいつも理想通りに動くとは限らないからです。ファイルが存在しない、ネットワーク通信が切れる、ユーザーの入力が間違っているなど、様々な理由でエラーは必ず発生します。エラーハンドリングを使うことでプログラムを途中で止めず、安全に処理を続けたり、ユーザーに丁寧な説明をしたりできます。Go言語のerror型はとてもシンプルで初心者でも扱いやすく、安定したシステムを作るために重要な仕組みです。

Go言語のerror型とは何ですか?変な型名で難しそうなのですが、初心者でも理解できますか?

Go言語のerror型は、エラーが発生したことを知らせるための特別な型です。難しそうに見えますが、実際にはエラーメッセージを入れる箱のような仕組みだと考えると簡単です。エラーがないときはnilになり、エラーが起きたときだけ値が入ります。初心者に優しい構造なので、心配せずに使えます。
関連セミナーのご案内

【超入門】ゼロから始めるGo言語プログラミング:最速で「動くアプリ」を作るマンツーマン指導

「プログラミングの仕組み」が根本からわかる。Go言語でバックエンド開発の第一歩を。

本講座を受講することで、単なる文法の暗記ではなく、「プログラムがコンピュータの中でどう動いているか」という本質的な理解につながります。シンプルながら強力なGo言語(Golang)を通じて、現代のバックエンドエンジニアに求められる基礎体力を最短距離で身につけます。

具体的な開発内容と環境

【つくるもの】
ターミナル(黒い画面)上で動作する「対話型計算プログラム」や、データを整理して表示する「ミニ・ツール」をゼロから作成します。自分の書いたコードが形になる感動を体験してください。

【開発環境】
プロの現場でシェアNo.1のVisual Studio Code (VS Code)を使用します。インストールから日本語化、Go言語用の拡張機能設定まで、現場基準の環境を一緒に構築します。

この60分で得られる3つの理解

1. 環境構築の完全な理解

「なぜ動くのか」という設定の仕組みを理解し、今後の独学で詰まらない土台を作ります。

2. Go言語の基本構造(変数・型)

データの種類やメモリの概念など、他言語にも通じるプログラミングの本質を学びます。

3. 読みやすいコードの書き方

ただ動くだけでなく、誰が見ても分かりやすい「綺麗なコード」を書くための考え方を伝授します。

※本講座は、将来的にバックエンドエンジニアクラウドインフラに興味がある未経験者のためのエントリー講座です。マンツーマン形式により、あなたの理解度に合わせて進行します。

セミナー画像

初めてのGo言語を一緒に学びましょう!

関連記事:
カテゴリの一覧へ
新着記事
New1
Go言語
Go言語のwhile的なforループの使い方!条件式ループの基本を解説
New2
Go言語
Go言語プログラムの実行方法まとめ!VSCode・ターミナルでの実行手順を解説
New3
Swift
Swift意味とは?プログラミング言語・金融・鳥の違いを徹底解説
New4
Swift
Swift 戻り値の扱い方と複数戻り値の返し方|初心者でも分かる関数の基本
人気記事
No.1
Java&Spring記事人気No1
Go言語
Go言語でリダイレクト処理を行う方法(http.Redirect)を初心者向けに解説
No.2
Java&Spring記事人気No2
Swift
Swift開発環境の構築方法を徹底解説!Xcode・Windows・Linux対応
No.3
Java&Spring記事人気No3
Kotlin
Android Studioのインストール手順と初期設定を初心者向けに完全解説!
No.4
Java&Spring記事人気No4
Kotlin
Gradleファイル(build.gradle.kts)の書き方と役割をやさしく解説!Kotlin初心者向け完全ガイド
No.5
Java&Spring記事人気No5
Go言語
Go言語のgo.modファイル完全ガイド!初心者でもわかる仕組みと書き方
No.6
Java&Spring記事人気No6
Swift
Swift Playgroundの使い方を完全解説!初心者に最適な学習環境の始め方
No.7
Java&Spring記事人気No7
Go言語
Go言語で条件式を1行で書くコツ!三項演算子の代替と短縮記法
No.8
Java&Spring記事人気No8
Kotlin
Kotlinのログ出力方法を完全ガイド!LogcatとTimberでトラブルシューティング