1. 正しい出品
  2. 商品名が空
  3. 価格が0
  4. 価格が上限超え
  5. 名前も価格も駄目なとき、名前が先
コース一覧
Go入門
エラーを作る

Go入門

変数とゼロ値、Go唯一のループであるfor、複数戻り値とエラー処理、スライスとマップ、構造体とメソッド、ゴルーチンによる並行処理、net/httpによるAPI開発まで、Goの基礎を、毎レッスン実際にコードを書き、フリマアプリのAPIをGoで作りながら学びます。

1
Hello, Go
01. Goとは15分
02. 実行してみる15分
03. packageとmain15分
04. fmtで出力する15分
05. go buildと1バイナリ15分
06. つくる: 起動バナー20分
07. 第1章クイズ10分
2
変数と型
01. varで宣言する15分
02. := の短縮宣言15分
03. ゼロ値(Goならでは)15分
04. 基本の型15分
05. 暗黙変換なし15分
06. 定数とiota15分
07. つくる: 商品データ表示20分
08. 第2章クイズ10分
3
制御構文(forしかない世界)
01. Goのif15分
02. forしかない世界15分
03. forの七変化15分
04. Goのswitch15分
05. 定番: FizzBuzz15分
06. ループで集計15分
07. つくる: 商品集計20分
08. 第3章クイズ10分
4
関数とエラー処理
01. funcで関数を作る15分
02. 複数戻り値(Goならでは)15分
03. if err != nil(Goの心臓)15分
04. エラーを作る15分
05. deferで後始末15分
06. つくる: 検証つき関数群20分
07. 第4章クイズ10分
5
スライスとマップ
01. 配列15分
02. スライス15分
03. appendで育てる15分
04. rangeで走査する15分
05. マップ15分
06. カンマokイディオム15分
07. つくる: 検索と集計20分
08. 第5章クイズ10分
6
構造体とメソッド
01. 構造体15分
02. 初期化とフィールド15分
03. メソッド15分
04. ポインタレシーバ20分
05. New関数の慣習15分
06. 構造体のスライス15分
07. つくる: Itemで再設計20分
08. 第6章クイズ10分
7
ゴルーチンと並行処理のさわり
01. ゴルーチン15分
02. チャネル20分
03. 待ち合わせ20分
04. 並行の落とし穴20分
05. つくる: 並行集計20分
06. 第7章クイズ10分
8
Web API(net/http)
01. サーバーを立てる20分
02. ハンドラ関数20分
03. JSONを返す20分
04. ルーティング20分
05. 一覧API20分
06. 詳細APIと40420分
07. 出品API20分
08. つくる: API主要部完成25分
09. 第8章クイズ10分
9
総合制作
01. 仕様互換を仕上げる25分
02. Node版と差し替える25分
03. 1バイナリでデプロイ25分
04. 自由拡張25分
05. 完成と次のステップ20分

エラーを作る

errors.New で作る

Go

import "errors" return errors.New("価格が0以下です")

渡した文字列が、そのエラーの理由になります。取り出すときは Error() を呼びます。

Go

err := errors.New("価格が0以下です") fmt.Println(err.Error()) // 価格が0以下です

fmt.Println(err) と書いても同じ文字が出ます。%v で埋め込むこともできます。

fmt.Errorf で値を混ぜる

理由に具体的な値を入れたいときは fmt.Errorf です。

Go

return fmt.Errorf("価格 %d は上限 %d を超えています", price, max)

プレーンテキスト

価格 2000000 は上限 1000000 を超えています

Sprintf と同じ型紙が使えます。違いは、文字列ではなく error を作ることだけです。

実際の開発では、こちらのほうが圧倒的に役に立ちます。「価格が上限を超えています」だけでは、いくらだったのか分からず調査に困ります。

エラー文の書き方

Go には慣習があります。

プレーンテキスト

小文字で始める 句点で終わらない errors.New("価格が0以下です") 日本語ならこれで問題ない errors.New("invalid price") 英語なら小文字始まり errors.New("Invalid price.") 英語では避ける形

理由は、エラーが他のエラーの中に埋め込まれることがあるからです。

プレーンテキスト

failed to create item: invalid price

途中に大文字や句点が混ざると、文としておかしくなります。日本語で書く場合はあまり気にしなくて済みますが、そういう習慣がある言語だと知っておくと、標準ライブラリのエラー文が読みやすくなります。

定義済みのエラーを持つ

同じエラーを何度も返す場合は、変数にしておく書き方もあります。

Go

var ErrNotFound = errors.New("商品が見つかりません") func findItem(id int) (int, error) { return 0, ErrNotFound }

呼び出し側で「このエラーかどうか」を比べられるようになります。

Go

if err == ErrNotFound { return "見つかりませんでした" }

文字列で比べると、文言を直した瞬間に壊れます。変数で比べるのが定石です。第8章で 404 を返す判断をするときに、この形が出てきます。

要件

  1. 商品名が空なら 商品名が空です を返す
  2. 価格が0以下なら 価格が0以下です を返す
  3. 価格が1000000より大きいなら 価格 N は上限を超えています を返す(N は実際の価格)
  4. 問題が無ければ 商品名 を登録しました を返す
  5. 判定は上の順番で行い、最初に見つかった問題を返す

入出力例

registerItem("きのこ図鑑", 1200) → "きのこ図鑑 を登録しました" registerItem("", 1200) → "商品名が空です" registerItem("きのこ図鑑", 0) → "価格が0以下です" registerItem("きのこ図鑑", 2000000) → "価格 2000000 は上限を超えています" registerItem("", -5) → "商品名が空です"

ヒント

3つ目だけ `fmt.Errorf("価格 %d は上限を超えています", price)` を使います。値を文に混ぜられるのが `Errorf` です

`registerItem` では `err.Error()` でエラーの文字列を取り出して返します

判定の順番が問われます。名前が空で価格も不正なときは、先に書いた名前のエラーが返ります

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/08/10

関連レッスン

  • deferで後始末

    関数の終わりに実行する処理を予約し、開始と終了のログを対で出せるようになります。

  • つくる: 検証つき関数群

    第4章の知識で出品の検証と計算をerror付きの関数にまとめられるようになります。

  • 第4章クイズ

    関数、複数戻り値、error、defer についての理解を確認します。

  • 配列

    長さが型の一部である配列を知り、固定長の並びを扱えるようになります。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • 標準ライブラリPythonに同梱の公式モジュール群
  • 変数データに名前をつけて参照する仕組み
  • 判断YES/NO 分岐を表す菱形
main.go
学習モード
エディタを読み込んでいます

メモ

エラーを作る

⌘S で保存