1. 本の商品
  2. 家電の商品
  3. 価格が0の商品
コース一覧
Go入門
JSONを返す

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分

JSONを返す

構造体を JSON にする

Go

import "encoding/json" item := Item{Name: "きのこ図鑑", Price: 1200} b, err := json.Marshal(item) string(b) // {"Name":"きのこ図鑑","Price":1200}

Marshal が構造体を JSON のバイト列に変えます。第4章の形どおり、(値, error) を返します。

キー名が大文字で困る

出力を見ると、キーが Name と Price になっています。Go のフィールド名がそのまま出ているためです。

JSON の世界では小文字が普通なので、そのままでは使いにくくなります。構造体タグで指定します。

Go

type Item struct { Name string `json:"name"` Price int `json:"price"` }

プレーンテキスト

{"name":"きのこ図鑑","price":1200}

フィールドの後ろにバッククォートで囲んで書くのがタグです。json.Marshal がこれを読んで、キー名を決めます。

小文字始まりのフィールドは出ない

第6章で触れた話が、ここで効いてきます。

Go

type Item struct { Name string `json:"name"` price int `json:"price"` // 出力されない }

json.Marshal は外から見えるフィールドしか読めません。小文字始まりは同じパッケージの中だけのものなので、対象外です。タグを書いても出ません。

「タグを書いたのに出ない」と悩んだら、まず頭文字を確かめてください。

空の値を省く

Go

type Item struct { Name string `json:"name"` Category string `json:"category,omitempty"` }

omitempty を付けると、ゼロ値のときにキーごと省かれます。

プレーンテキスト

Category が "" のとき {"name":"きのこ図鑑"} Category が "本" のとき {"name":"きのこ図鑑","category":"本"}

第2章のゼロ値がここでも顔を出します。「値が空」と「キーが無い」を区別する API では、この挙動が問題になることもあります。

応答として返す

Go

func itemHandler(w http.ResponseWriter, r *http.Request) { item := Item{Name: "きのこ図鑑", Price: 1200} w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(item) }

NewEncoder(w).Encode(...) は、Marshal して w に書くところまでを1行でやります。応答を返すときはこちらが定番です。

Content-Type を書くのは、受け取る側に JSON だと伝えるためです。ヘッダは本文より先に書きます。WriteHeader と同じ順序の決まりです。

なお Encode は末尾に改行を付けます。この挙動は覚えておいてください。応答を1文字単位で比べるときに引っかかります。

要件

  1. Item の3つのフィールドに構造体タグを付ける
  2. キー名は name・price・category
  3. json.Marshal で変換して w.Write で書く
  4. 本文だけを返す

入出力例

itemJSON("きのこ図鑑", 1200, "本") → "{"name":"きのこ図鑑","price":1200,"category":"本"}" itemJSON("中古スマホ", 24800, "家電") → "{"name":"中古スマホ","price":24800,"category":"家電"}" itemJSON("おまけ", 0, "その他") → "{"name":"おまけ","price":0,"category":"その他"}"

ヒント

フィールドの後ろにバッククォートで囲んだタグを書きます。`Name string` の後ろに json:"name" のタグです

タグの中は `json:"name"` の形です。コロンの後にスペースを入れないでください

キーの並び順は構造体で定義した順になります。Name・Price・Category の順に書いてください

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

関連レッスン

  • ルーティング

    パスとメソッドで処理を分け、複数のエンドポイントを1つのサーバーに置けるようになります。

  • 一覧API

    コレクションを返し、クエリパラメータで絞り込めるGET /itemsを作れるようになります。

  • 詳細APIと404

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

  • 出品API

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

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

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

  • applicationJSON 本文を送るときの Content-Type
  • フィールドクラスが持つデータ
  • エンドポイント「この URL を叩くとこの機能が動く」入口の住所
  • APIアプリ間でデータをやり取りする窓口
main.go
学習モード
エディタを読み込んでいます

メモ

JSONを返す

⌘S で保存