自由拡張
仕様の外を作る
ここまでは、決められた仕様を満たす作業でした。最後は自分で決めて作ります。
仕様書に無いものを足すとき、まず考えるのは「誰が何に困っているか」です。
プレーンテキスト
出品者 自分の商品がいくら売れているか知りたい
運営 カテゴリごとの傾向を見たい
購入者 安い順に並べたい困りごとが決まれば、必要なエンドポイントは自然に決まります。
集計 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章でゴルーチンを学びましたが、この規模では使わないほうがよいです。
プレーンテキスト
数十件の集計 ゴルーチンの準備のほうが高くつく
数万件の集計 分割して並行にする価値がある
外部への問い合わせが複数 待ち時間が重なるので効く並行にすれば速くなる、ではありません。待ち時間があるときに効く道具です。使いどころを見極めるのも、覚えたことの一部です。
要件
- カテゴリごとに件数と合計金額を集計する
- 合計金額の多い順に並べる
- 同額のときはカテゴリ名の小さい順にする
- 応答は
{"stats":[...]}の形 - 0件でも
"stats":[]を返す
入出力例
callStats() → "{"stats":[{"category":"家電","count":1,"total":24800},{"category":"本","count":2,"total":2000}]}"ヒント
編集 ゆめさく編集部