コース一覧
    Go実践:並行処理とWeb API
    一覧API

    Go実践:並行処理とWeb API

    Goの並行処理とWeb API開発を組み合わせ、実践的なサービス構築へ進むコースです。

    1
    ゴルーチンと並行処理のさわり
    01. ゴルーチン15分
    02. チャネル20分
    03. 待ち合わせ20分
    04. 並行の落とし穴20分
    05. つくる: 並行集計20分
    06. 第7章クイズ10分
    2
    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分
    3
    総合制作
    01. 仕様互換を仕上げる25分
    02. Node版と差し替える25分
    03. 1バイナリでデプロイ25分
    04. 自由拡張25分
    05. 完成と次のステップ20分

    一覧API

    コレクションを返す

    1件を返すのと、一覧を返すのは形が違います。

    プレーンテキスト

    1件    {"name":"きのこ図鑑","price":1200}
    一覧    [{"name":"きのこ図鑑",...},{"name":"中古スマホ",...}]

    スライスを Marshal すれば、そのまま配列になります。

    Go

    items := []Item{...}
    b, _ := json.Marshal(items)

    0件のときが問題になる

    第5章のスライスのゼロ値を思い出してください。nil です。

    Go

    var items []Item      // nil
    b, _ := json.Marshal(items)
    string(b)   // "null"

    空の配列 [] ではなく null になります。

    受け取る側にとって、これは困ります。

    JavaScript

    const items = await res.json()
    items.length   // null だとエラーになる

    0件でも [] を返すには、空のスライスを明示的に作ります。

    Go

    items := []Item{}     // nil ではない空スライス
    b, _ := json.Marshal(items)
    string(b)   // "[]"

    var items []Item と items := []Item{} は、JSON にしたときだけ違いが出ます。len はどちらも 0 で、append もどちらもできるので、普段は同じように扱えます。

    API を書くときは []Item{} から始める、と覚えておくと事故が減ります。

    絞り込みを足す

    プレーンテキスト

    GET /items?keyword=きのこ

    前のレッスンでやったクエリパラメータの読み取りと、第6章の絞り込みを組み合わせます。

    Go

    keyword := r.URL.Query().Get("keyword")
    result := []Item{}
    for _, item := range all {
    	if keyword == "" || item.Name == keyword {
    		result = append(result, item)
    	}
    }

    keyword が空なら全件、という条件は第6章の Matches メソッドと同じ形です。

    件数を返すこともある

    一覧だけを返す形と、件数を添える形があります。

    プレーンテキスト

    配列そのまま    [{...},{...}]
    包む形          {"total":2,"items":[{...},{...}]}

    包む形は、総件数やページ情報を一緒に返したいときに使います。ページ送りのある一覧では、こちらが必要になります。

    どちらが正しいということはありません。 ただし1つの API の中では揃えてください。エンドポイントごとに形が違うと、使う側が毎回確かめることになります。

    要件

    1. クエリパラメータ keyword で絞り込む
    2. keyword が空なら全件を返す
    3. 商品名の完全一致で判定する
    4. 該当0件のときは null ではなく [] を返す

    ヒント

    初期コードの `var result []Item` を `result := []Item{}` に変えてください。これが `null` を防ぎます

    絞り込みの条件は `if keyword == "" || item.Name == keyword {` です

    `allItems()` は関数なので、呼ぶときに括弧が要ります

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

    関連レッスン

    • 詳細APIと404

      パスからIDを取り出して1件返し、見つからないときに404を返せるようになります。

    • 出品API

      POSTのボディを読んで検証し、不正なら400を返して登録できるようになります。

    • つくる: API主要部完成

      第8章の知識でエンドポイント一式を実装し、fleama API仕様との突合を通せるようになります。

    • 第8章クイズ

      net/http、ハンドラ、JSON、ルーティング、ステータスコードについての理解を確認します。

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

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

    • スライス範囲指定で部分列を取り出す記法
    • 配列サイズ固定の同型データの集まり
    • applicationJSON 本文を送るときの Content-Type
    • エンドポイント「この URL を叩くとこの機能が動く」入口の住所
    • APIアプリ間でデータをやり取りする窓口
    • クエリパラメータURL の `?` 以降に付ける `key=value` 形式のリクエストデータ
    • メソッドクラスに属する関数
    main.go
    エディタを読み込んでいます

    メモ

    一覧API

    ⌘S で保存