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

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 {
        // エラー時にはゼロ値のFileInfoとエラーを返す
        return FileInfo{}, err
    }
    // 正常時には構造体に値をまとめて返す
    return FileInfo{Name: fi.Name(), Size: fi.Size()}, nil
}

// 呼び出し例
info, err := getFileInfo("sample.txt")
if err != nil {
    fmt.Println("ファイル情報の取得に失敗:", err)
} else {
    fmt.Println("ファイル名:", info.Name, "サイズ:", info.Size, "バイト")
}

このように構造体にまとめると、複数の戻り値を整理して返せるため、関数の使い方が直感的になり、初心者でも理解しやすいコードになります。

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

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

※ Amazon広告リンク

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

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

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

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

戻り値とエラーはまずエラーを先にチェックして早期リターンを使うと、正常処理と異常処理が分かりやすくなります。初心者でもコードの見通しが良くなる書き方です。
関連セミナーのご案内

【超入門】ゼロから始める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の演算子一覧と使い方!算術・比較・論理演算子の基本を解説