1. キーワードで1件に絞る
  2. キーワードが空なら全件
  3. 該当なし
  4. 平均が切り捨てになる
コース一覧
Go入門
つくる: Itemで再設計

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分

つくる: Itemで再設計

第5章のコードを書き換える

第5章のつくる回で書いた検索と集計を、Item を使う形に作り直します。新しい知識は出てきません。

第5章の関数はこうでした。

Go

func searchSummary(names []string, prices []int, categories []string, keyword string) string

並びが3つ並んでいます。同じ添字が同じ商品を指すという約束が、コードのどこにも書かれていません。

Item にまとめると、こうなります。

Go

func searchSummary(items []Item, keyword string) string

これがリファクタリングです。 動きは変えず、形だけを良くします。答えが同じであることを、テストが保証してくれます。

メソッドに寄せる

判定や計算を Item のメソッドにすると、集計の側が読みやすくなります。

Go

func (i Item) Matches(keyword string) bool { return keyword == "" || i.Name == keyword }

呼ぶ側はこうなります。

Go

if !item.Matches(keyword) { continue }

条件の中身が名前になったぶん、何をしているのか一目で分かります。

|| は「または」です。片方が真なら真になります。キーワードが空、または名前が一致、という条件をそのまま書けます。

何をメソッドにするか

プレーンテキスト

その型のデータだけで判断できる → メソッドにできる 外の情報が要る → 関数のまま

Matches は Item の名前とキーワードだけで判断できるので、メソッド向きです。一方「一覧の中で最高額か」は他の商品を知る必要があるので、メソッドにはできません。

順番に作る

プレーンテキスト

1. Item に Matches メソッドを付ける 2. 引数を []Item に変える 3. 集計を item.Price で書き直す 4. 該当0件のときを分ける

この演習では、呼び出し側が並びを渡してくるので、関数の中でまず []Item を組み立ててから処理してください。

要件

  1. Item に Matches(keyword string) bool メソッドを付ける
  2. キーワードが空文字のときは常に true を返す
  3. Matches を使って絞り込む
  4. 該当N件 合計M円 平均K円 の形を返す
  5. 該当が0件なら 該当なし を返す

入出力例

itemSearch(["きのこ図鑑","中古スマホ","古い辞書"], [1200,24800,800], ["本","家電","本"], "きのこ図鑑") → "該当1件 合計1200円 平均1200円" itemSearch(["きのこ図鑑","古い辞書"], [1200,800], ["本","本"], "") → "該当2件 合計2000円 平均1000円" itemSearch(["きのこ図鑑"], [1200], ["本"], "謎の箱") → "該当なし" itemSearch(["A","B","C"], [100,200,300], ["本","本","本"], "") → "該当3件 合計600円 平均200円"

ヒント

`func (i Item) Matches(keyword string) bool {` の形でメソッドを足します

中身は `return keyword == "" || i.Name == keyword` の1行で書けます

絞り込みは `if !item.Matches(keyword) { continue }` です。感嘆符の付け忘れに注意してください

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

関連レッスン

  • 第6章クイズ

    構造体、メソッド、ポインタレシーバ、New関数についての理解を確認します。

  • ゴルーチン

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

  • サーバーを立てる

    net/httpでHTTPサーバーを立て、リクエストに応答を返せるようになります。

  • 仕様互換を仕上げる

    ステータスコードとエラー形式を仕様に揃え、互換のあるAPIとして仕上げられるようになります。

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

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

  • 関数処理に名前を付けて再利用できる単位
  • テストバグを見つける工程
  • メソッドクラスに属する関数
  • 判断YES/NO 分岐を表す菱形
  • 処理計算や代入を表す長方形
main.go
学習モード
エディタを読み込んでいます

メモ

つくる: Itemで再設計

⌘S で保存