1. 合計の多い順に並ぶ
コース一覧
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分

自由拡張

仕様の外を作る

ここまでは、決められた仕様を満たす作業でした。最後は自分で決めて作ります。

仕様書に無いものを足すとき、まず考えるのは「誰が何に困っているか」です。

プレーンテキスト

出品者 自分の商品がいくら売れているか知りたい 運営 カテゴリごとの傾向を見たい 購入者 安い順に並べたい

困りごとが決まれば、必要なエンドポイントは自然に決まります。

集計 API を足す

このレッスンでは、カテゴリ別の集計を返す API を作ります。

プレーンテキスト

GET /stats {"stats":[{"category":"本","count":2,"total":2000},{"category":"家電","count":1,"total":24800}]}

第5章のマップ、第6章の構造体、第8章の JSON が全部出てきます。

並び順を決める

第5章でやったとおり、マップを回す順番は毎回変わります。API の応答が毎回違う順で返ると、使う側が困ります。

決め方は自分で選びます。

プレーンテキスト

カテゴリ名の順 安定するが、意味は薄い 件数の多い順 よく使われる。同数のときの決め方が要る 登場順 入力に依存する

この演習では合計金額の多い順にします。同額のときはカテゴリ名の順です。「同じときどうするか」まで決めて初めて、順番が確定します。

並べ替えは sort

Go

import "sort" sort.Slice(stats, func(i, j int) bool { if stats[i].Total != stats[j].Total { return stats[i].Total > stats[j].Total } return stats[i].Category < stats[j].Category })

sort.Slice は、「i が j より前に来るか」を返す関数を渡す形です。true なら i が先です。

プレーンテキスト

> 大きいほうが先(降順) < 小さいほうが先(昇順)

1つ目の条件で差が付かないときだけ、2つ目を見る。この書き方が、複数条件で並べるときの定石です。

並行にするか

第7章でゴルーチンを学びましたが、この規模では使わないほうがよいです。

プレーンテキスト

数十件の集計 ゴルーチンの準備のほうが高くつく 数万件の集計 分割して並行にする価値がある 外部への問い合わせが複数 待ち時間が重なるので効く

並行にすれば速くなる、ではありません。待ち時間があるときに効く道具です。使いどころを見極めるのも、覚えたことの一部です。

要件

  1. カテゴリごとに件数と合計金額を集計する
  2. 合計金額の多い順に並べる
  3. 同額のときはカテゴリ名の小さい順にする
  4. 応答は {"stats":[...]} の形
  5. 0件でも "stats":[] を返す

入出力例

callStats() → "{"stats":[{"category":"家電","count":1,"total":24800},{"category":"本","count":2,"total":2000}]}"

ヒント

件数と合計を、それぞれ別のマップで数えます。第5章でやった `counts[key]++` の形です

マップを回して `[]CategoryStat` に詰め替えてから、`sort.Slice` で並べます

`sort.Slice` に渡す関数は「i が j より前に来るか」を返します。降順なら `>` です

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

関連レッスン

  • 完成と次のステップ

    fleama-goの完成を確かめ、次に学ぶものを自分で選べるようになります。

  • 1バイナリでデプロイ

    go buildで作った1つのバイナリをサーバーに置き、常駐させる手順を説明できるようになります。

  • Node版と差し替える

    同じ仕様の別実装に置き換えられることを確かめ、実務のリプレイスを疑似体験します。

  • 仕様互換を仕上げる

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

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

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

  • エンドポイント「この URL を叩くとこの機能が動く」入口の住所
  • APIアプリ間でデータをやり取りする窓口
  • applicationJSON 本文を送るときの Content-Type
  • 関数処理に名前を付けて再利用できる単位
main.go
学習モード
エディタを読み込んでいます

メモ

自由拡張

⌘S で保存