コース一覧
    Go基礎:制御構文
    if err != nil(Goの心臓)

    Go基礎:制御構文

    Goの分岐、反復、関数、エラー処理を体系的に学ぶ基礎コースです。

    1
    制御構文(forしかない世界)
    01. Goのif15分
    02. forしかない世界15分
    03. forの七変化15分
    04. Goのswitch15分
    05. 定番: FizzBuzz15分
    06. ループで集計15分
    07. つくる: 商品集計20分
    08. 第3章クイズ10分
    2
    関数とエラー処理
    01. funcで関数を作る15分
    02. 複数戻り値(Goならでは)15分
    03. if err != nil(Goの心臓)15分
    04. エラーを作る15分
    05. deferで後始末15分
    06. つくる: 検証つき関数群20分
    07. 第4章クイズ10分

    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円で登録できます を返す

    ヒント

    `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 で保存