1. 正しい出品
  2. 切り捨てが起きる出品
  3. 商品名が空
  4. 価格が0
  5. 上限超え
  6. 上限ちょうどは通る
コース一覧
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分

つくる: 検証つき関数群

エラー設計込みで組む

第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円、失敗ならエラーの理由を返す

入出力例

submit("きのこ図鑑", 1200) → "きのこ図鑑 受取額1080円" submit("古い辞書", 999) → "古い辞書 受取額900円" submit("", 1200) → "商品名が空です" submit("きのこ図鑑", 0) → "価格が0以下です" submit("高級品", 2000000) → "価格 2000000 は上限を超えています" submit("高級品", 1000000) → "高級品 受取額900000円"

ヒント

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

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

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

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

関連レッスン

  • 第4章クイズ

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

  • 配列

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

  • 構造体

    関連するデータを1つの型にまとめ、Item構造体を定義できるようになります。

  • ゴルーチン

    goキーワードで処理を並行に走らせ、順番が決まらない理由を説明できるようになります。

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

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

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

メモ

つくる: 検証つき関数群

⌘S で保存