カテゴリ: Go言語 更新日: 2026/01/10

Go言語のエラーハンドリングにおける戻り値の扱いの工夫例!初心者に優しい設計パターン

Go言語のエラーハンドリングにおける戻り値の扱いの工夫例
Go言語のエラーハンドリングにおける戻り値の扱いの工夫例

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

生徒

「先生、関数から返ってくる戻り値とエラーを上手に扱うコツってありますか?」

先生

「ええ、たとえば複数の戻り値があるとき『先にエラーだけチェックしてスッキリ書く』方法などがありますよ。」

生徒

「戻り値の扱いを工夫するって、どんなふうに書くんですか?」

先生

「では、よく使われるパターンをいくつか見てみましょう!」

1. 戻り値とエラーを分けて簡潔に書く

1. 戻り値とエラーを分けて簡潔に書く
1. 戻り値とエラーを分けて簡潔に書く

例えばファイルを読み込む関数の場合、通常は<code>内容, err := 読み込み関数()</code>のように戻ってきます。このとき、エラーが発生する可能性があるため、まず最初にif err != nilでチェックするのが基本です。

エラーを先に確認することで、正常時の処理が明確になり、コード全体の見通しが良くなります。初心者でも理解しやすい構造になります。


data, err := readFile("hello.txt")
if err != nil {
    // エラーがあればここで処理を中断
    return "", err
}
// エラーがなければここから通常処理
result := process(data)
return result, nil

このように書くと、エラー処理と通常処理が分かれて見やすく、関数の動きが直感的に理解できるようになります。初心者でも安心して書けるパターンです。

2. 名前付き戻り値で処理を分かりやすく

2. 名前付き戻り値で処理を分かりやすく
2. 名前付き戻り値で処理を分かりやすく

名前付き戻り値は、関数の戻り値に変数名を付けることで、関数内でどの値が何を意味するかが明確になります。これにより、初心者でも処理の流れを追いやすく、コードの可読性が上がります。

例えば、数字を割る関数でゼロ除算の可能性がある場合、戻り値にresulterrを名前付きで指定すると、エラー発生時や正常時の値が直感的にわかります。


func divide(a, b int) (result int, err error) {
    if b == 0 {
        // 0で割ろうとした場合はエラーを設定して終了
        err = fmt.Errorf("0では割れません")
        return
    }
    // 正常な場合は計算結果をresultに代入
    result = a / b
    return
}

// 呼び出し例
res, err := divide(10, 2)
if err != nil {
    fmt.Println("エラー:", err)
} else {
    fmt.Println("結果:", res)
}

このように書くことで、関数の処理が見やすくなり、エラー時の対応も簡単に行えます。初心者でも「どこで何が返るか」がすぐ理解でき、安心して関数を作成できます。

3. 複数戻り値をまとめて扱うパターン

3. 複数戻り値をまとめて扱うパターン
3. 複数戻り値をまとめて扱うパターン

複数の値を返す関数では、エラー以外の戻り値を構造体にまとめると見通しが良くなります。


type FileInfo struct {
    Name string
    Size int64
}

func getFileInfo(path string) (FileInfo, error) {
    fi, err := os.Stat(path)
    if err != nil {
        return FileInfo{}, err
    }
    return FileInfo{Name: fi.Name(), Size: fi.Size()}, nil
}

構造体にまとめることで、戻り値の意味が明確になります。

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

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

※ Amazon広告リンク

4. 戻り値のゼロ値とエラー処理

4. 戻り値のゼロ値とエラー処理
4. 戻り値のゼロ値とエラー処理

エラー時には戻り値に「ゼロ値(zero value)」を使います。たとえばstring→""int→0です。

これはGoの慣例で、空の値とerr != nilの組み合わせで「失敗したよ」がわかります。

5. ユーティリティ関数で共通処理をまとめる

5. ユーティリティ関数で共通処理をまとめる
5. ユーティリティ関数で共通処理をまとめる

繰り返し出てくるエラーチェックは、別の関数にまとめてしまうとコードが整います。


func checkErr(err error) {
    if err != nil {
        log.Fatal(err)
    }
}

func main() {
    data, err := os.ReadFile("data.txt")
    checkErr(err)
    fmt.Println(string(data))
}

これでif err != nilの繰り返しを避けられます。

6. 複数処理のエラーをまとめて返す

6. 複数処理のエラーをまとめて返す
6. 複数処理のエラーをまとめて返す

例えば二つの処理の結果をまとめて返したいとき、エラーは複数になる場合があります。


func processAll(a, b string) (string, error) {
    r1, err1 := doA(a)
    if err1 != nil {
        return "", fmt.Errorf("doA失敗: %w", err1)
    }
    r2, err2 := doB(b)
    if err2 != nil {
        return "", fmt.Errorf("doB失敗: %w", err2)
    }
    return r1 + r2, nil
}

こうすると、どちらで失敗したかがわかる詳しいメッセージが得られます。

7. 戻り値処理の工夫でコードが読みやすくなる理由

7. 戻り値処理の工夫でコードが読みやすくなる理由
7. 戻り値処理の工夫でコードが読みやすくなる理由
  • エラーは先にチェックして早めに返すことで、残りの処理が見やすくなる
  • 名前付き戻り値や構造体で戻り値に意味を持たせて見通しを良くできる
  • ユーティリティ化によって重複を減らし、エラー処理を一元化できる
  • エラーをわかりやすくラップ(%w)することで、原因が追いやすくなる

このような工夫をすることで、可読性が高く、バグが入り込みにくいコードになります。

まとめ

まとめ
まとめ

Go言語の戻り値とエラー処理を深く理解するための総まとめ

Go言語における戻り値とエラー処理は、初心者がつまずきやすい要素でありながら、丁寧に学ぶことで非常に強力なコード設計につながります。とくに関数が複数の値を返す特徴は、処理結果とエラーの両方を明確に扱えるという大きな利点があります。戻り値を整理しながら安全に処理を進めるためには、さまざまな書き方の工夫が存在し、早期リターンや名前付き戻り値、構造体による管理、ゼロ値の活用などが重要な考え方になります。これらは複雑な業務処理でも活かされ、保守しやすく読みやすいコードを構築するための基礎となります。 さらに、関数の使い分けによって可読性を向上させる方法や、エラー情報を重ねることで原因を追跡しやすくする手法など、実践で役立つ多くの知識が含まれています。戻り値をどう扱うかは設計全体の見通しに影響し、適切に整理されたコードは開発中だけでなく運用後のトラブル対応にも強くなります。ここで学んだ内容を意識してコードを書くことで、より信頼性が高く柔軟な処理を実装できるようになります。 下記のサンプルは記事全体で学んだ要点をまとめて整理し、戻り値とエラーの扱い方を実際のコードとして確認できるようにしたものです。記事の流れに合わせて同じタグ構成やクラスを使い、学習の参考として活用しやすい形式にしています。

戻り値とエラー処理を統合したサンプルプログラム


package main

import (
    "fmt"
    "os"
)

type Result struct {
    Title string
    Size  int64
}

func loadFile(path string) (Result, error) {
    info, err := os.Stat(path)
    if err != nil {
        return Result{}, fmt.Errorf("読み込み失敗: %w", err)
    }
    return Result{Title: info.Name(), Size: info.Size()}, nil
}

func main() {
    r, err := loadFile("sample.txt")
    if err != nil {
        fmt.Println("エラー:", err)
        return
    }
    fmt.Println("名前:", r.Title, "サイズ:", r.Size)
}

このプログラムは、戻り値を構造体にまとめることで内容を扱いやすくし、エラーが発生した際にはラップしたメッセージを返す形で原因を追いやすくしています。また、ゼロ値を返すことで失敗時の状態を明確にし、正常時と異常時の流れを整理しやすくしています。このように戻り値の扱いを丁寧に設計することは、処理に対する理解を深めるだけでなく、他の開発者にも読みやすいコードを共有することにつながります。 名前付き戻り値によって返却値を自然に扱える場面や、中間処理の段階でエラーを早期に返すことでロジックを簡潔にする工夫は、日常的な開発において大きな効果を発揮します。とくに複数の戻り値を扱う場面が多いプロジェクトでは、戻り値とエラーの整理が品質向上に直結します。こうした積み重ねは、安定したアプリケーション開発に不可欠な要素であり、Go言語が持つ特性を活かす第一歩でもあります。 また、ユーティリティ関数によって重複処理を減らすと、全体の見通しがよくなり、複数の処理が絡む場面でもエラー処理が統一されて安全性が増します。こうした構成は長期の運用にも強く、システム開発における信頼性の向上にもつながります。

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

生徒

「きょう学んだ戻り値とエラーの整理は、実際の開発でどう役立つのでしょうか?」

先生

「複雑な処理でも流れがすぐ理解できるようになるし、あとから読む人にも親切なコードになるんだよ。エラーがどこで発生したかも追いやすくなるんだ。」

生徒

「たしかに早期リターンや構造体の整理で読みやすくなりました。ゼロ値やラップメッセージも便利ですね。」

先生

「その理解はとても大切だよ。戻り値をどう扱うかでコードは大きく変わるからね。これからもっと複雑な処理にも挑戦できるようになるよ。」

生徒

「次はより高度なエラーパターンや運用時の扱いも学んでみたいです!」

先生

「いい心がけだね。Go言語のエラー設計は奥が深いから、どんどん経験を積んでいこう。」

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

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

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

Go言語で関数の戻り値とエラーを同時に扱うコツは何ですか?

戻り値とエラーはまずエラーを先にチェックして早期リターンを使うと、正常処理と異常処理が分かりやすくなります。初心者でもコードの見通しが良くなる書き方です。
関連記事:
カテゴリの一覧へ
新着記事
New1
Go言語
Go言語の短絡評価(ショートサーキット)を使った条件式の工夫をやさしく解説!初心者でも理解できる基本知識
New2
Go言語
Go言語の構造体の初期化パターンとコンストラクタ的関数の書き方を徹底解説!初心者でもわかる基本と実用例
New3
Kotlin
Kotlinの例外処理とキャンセルの連携を完全ガイド!初心者でもわかるCoroutineExceptionHandlerの使い方
New4
Go言語
Go言語のクロージャとは?関数内関数の活用例と仕組み
人気記事
No.1
Java&Spring記事人気No1
Kotlin
KotlinのChannelでデータをやり取りする方法を完全ガイド!初心者にもわかる非同期通信の基本
No.2
Java&Spring記事人気No2
Go言語
Go言語でのDB接続情報を環境変数で管理する方法|初心者でも安全に設定
No.3
Java&Spring記事人気No3
Kotlin
Android Studioのインストール手順と初期設定を初心者向けに完全解説!
No.4
Java&Spring記事人気No4
Kotlin
Kotlinのビルド設定エラーと解決法まとめ!初心者向けGradleトラブル対処ガイド
No.5
Java&Spring記事人気No5
Kotlin
Gradleファイル(build.gradle.kts)の書き方と役割をやさしく解説!Kotlin初心者向け完全ガイド
No.6
Java&Spring記事人気No6
Kotlin
Kotlinでテキスト表示・編集!初心者でもわかるTextViewとEditTextの使い方
No.7
Java&Spring記事人気No7
Kotlin
Kotlin DSLとGroovy DSLの違いをやさしく解説!初心者でもわかるGradleスクリプトの使い分け
No.8
Java&Spring記事人気No8
Go言語
Go言語のgo.modファイル完全ガイド!初心者でもわかる仕組みと書き方

💻 作業効率アップに

ノートPCを縦置きしてデスクを広く。
省スペースで片づく定番スタンド

UGREEN 縦型スタンドをAmazonで見る

※ Amazon広告リンク