1. 正しい価格
  2. 0円
  3. 負の価格
  4. 上限ちょうど
  5. 上限超え
コース一覧
Go入門
if err != nil(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分

if err != nil(Goの心臓)

例外がない

多くの言語には、失敗したときに処理を中断して呼び出し元へ飛ばす仕組み(例外)があります。Go にはありません。

代わりに、失敗を戻り値で返します。

Go

func parsePrice(s string) (int, error) { ... }

前のレッスンの bool が error に変わっただけです。ただし error は理由を持てます。

受け取ったら必ず確かめる

Go

price, err := parsePrice("1200") if err != nil { return "読み取れませんでした" } // ここから先、price は信用してよい

この4行が Go で最もよく書かれる形です。エラーが nil なら成功、nil でなければ失敗です。

nil は「何も無い」を表す値です。error のゼロ値が nil なので、うまくいったときは何も返さないという形になります。

なぜこの形なのか

例外は、書かなくても勝手に飛んでいきます。楽ですが、どこで失敗しうるのか読んでも分かりません。

Go は逆です。失敗する可能性のある呼び出しは、必ず err を受け取る形になります。

Go

price, err := parsePrice(input) if err != nil { ... } item, err := findItem(id) if err != nil { ... }

同じ形が何度も並びます。冗長だと言われ続けている書き方でもあります。その代わり、失敗する場所が全部目に見えます。読み飛ばせません。

if の初期化文が効く

第3章で触れた、条件の前に文を置ける if がここで生きます。

Go

if _, err := parsePrice(input); err != nil { return "読み取れませんでした" }

err がこの if の中だけの変数になり、後ろに残りません。値のほうが要らないときに使う形です。

やってはいけない書き方

Go

price, _ := parsePrice(input) // エラーを捨てている

_ でエラーを捨てると、失敗しても気づけません。price にはゼロ値の 0 が入り、そのまま計算に使われます。

Go で最も嫌われる書き方です。 捨ててよいのは、失敗しないと確信できる場合か、失敗しても本当に困らない場合だけです。そしてその判断は、たいてい間違っています。

エラーは値である

error は特別な構文ではなく、ただの型です。変数に入れて持ち回ることも、まとめて返すこともできます。

Go

var err error // ゼロ値は nil

「エラーは値である」という言い方を Go の界隈でよく聞きます。特別扱いしないことが、この言語の一貫した態度になっています。

要件

  1. validatePrice の戻り値を err で受け取る
  2. err != nil のときは 登録できません を返す
  3. エラーが無ければ N円で登録できます を返す

入出力例

checkPrice(1200) → "1200円で登録できます" checkPrice(0) → "登録できません" checkPrice(-100) → "登録できません" checkPrice(1000000) → "1000000円で登録できます" checkPrice(1000001) → "登録できません"

ヒント

`err := validatePrice(price)` で受け取ります。戻り値は1つなのでカンマは要りません

`if err != nil {` が失敗したときの分岐です。`== nil` と書き間違えると答えが逆になります

上限ちょうどの 1000000 は通ります。`> 1000000` なので、等しいときはエラーになりません

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

関連レッスン

  • エラーを作る

    errors.Newとfmt.Errorfで自分のエラーを返し、理由の分かる失敗を作れるようになります。

  • deferで後始末

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

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

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

  • 第4章クイズ

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

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

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

  • 処理計算や代入を表す長方形
  • 戻り値呼び出し元への返答を表す点線矢印
  • 変数データに名前をつけて参照する仕組み
  • 判断YES/NO 分岐を表す菱形
main.go
学習モード
エディタを読み込んでいます

メモ

if err != nil(Goの心臓)

⌘S で保存