コース一覧
    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分

    つくる: 検証つき関数群

    エラー設計込みで組む

    第4章の内容を全部使います。

    プレーンテキスト

    func              関数に切り出す
    複数戻り値        値とエラーを一緒に返す
    if err != nil     受けて分岐する
    errors.New        理由を持つエラーを作る
    fmt.Errorf        値を混ぜたエラーを作る

    作るのは、出品を受け付ける処理です。検証して、手数料を引いて、結果を返します。

    プレーンテキスト

    きのこ図鑑 受取額1080円

    関数を3つに分ける

    1つの関数に全部書くと、どこが検証でどこが計算か読み取れません。役割で分けます。

    プレーンテキスト

    validate    検証する。問題があれば error を返す
    feeOf       手数料を計算する
    submit      上の2つを使って結果を組み立てる

    submit から見ると、検証は「通ったか通らないか」だけ、手数料は「いくらか」だけです。中身を知らなくても組み立てられます。

    エラーを返すか、文字列を返すか

    submit は表示用の文字列を返します。ですが内部の関数はエラーを返すべきです。

    Go

    func validate(name string, price int) error   // これでよい
    func validate(name string, price int) string  // 呼ぶ側が判断できない

    文字列で返すと、呼ぶ側は「これは成功のメッセージか、失敗の理由か」を文字を見て判断することになります。error なら nil かどうかで機械的に分かります。

    表示に直すのは、いちばん外側でやる。 これは Go に限らず通じる考え方で、第8章で HTTP のステータスコードを決めるときにも同じ判断が出てきます。

    検証の順番

    前のレッスンと同じく、上から順に見て最初の問題を返します。

    プレーンテキスト

    1. 商品名が空
    2. 価格が0以下
    3. 価格が上限超え

    複数の問題を全部集めて返す設計もありますが、入門では最初の1つで止めるほうが素直です。

    順番に作る

    プレーンテキスト

    1. validate を書いてテストを流す(エラー系のテストが通る)
    2. feeOf を書く
    3. submit で組み立てる

    要件

    1. validate は検証して error を返す。問題が無ければ nil
    2. 検証の順番は 商品名が空 → 価格が0以下 → 価格が上限超え
    3. 上限超えのエラーだけ fmt.Errorf で実際の価格を含める
    4. feeOf は価格の10パーセントを切り捨てて返す
    5. submit は成功なら 商品名 受取額N円、失敗ならエラーの理由を返す

    ヒント

    `if err := validate(name, price); err != nil {` と書くと、err をこの if の中だけの変数にできます

    受取額は `price - feeOf(price)` です。999円なら手数料99円で受取額900円になります

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

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

    関連レッスン

    • 第4章クイズ

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

    • deferで後始末

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

    • エラーを作る

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

    • if err != nil(Goの心臓)

      errorを受けて分岐する型を身につけ、失敗を無視しないコードを書けるようになります。

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

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

    • 設計何をどう作るかを決める前工程
    • 処理計算や代入を表す長方形
    • 関数処理に名前を付けて再利用できる単位
    • 判断YES/NO 分岐を表す菱形
    • HTTPWeb の通信プロトコル、HTTPS は TLS で暗号化したもの
    • ステータスコード200/201/404 など結果を示す3桁の数値
    main.go
    エディタを読み込んでいます

    メモ

    つくる: 検証つき関数群

    ⌘S で保存