1. 全件
  2. キーワードで1件
  3. 該当なしは空配列
コース一覧
Go入門
一覧API

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

コレクションを返す

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 ではなく [] を返す

入出力例

callList("") → "[{"name":"きのこ図鑑","price":1200},{"name":"中古スマホ","price":24800}]" callList("keyword=中古スマホ") → "[{"name":"中古スマホ","price":24800}]" callList("keyword=謎の箱") → "[]"

ヒント

初期コードの `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 で保存