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

    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分

    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. 本文だけを返す

    ヒント

    フィールドの後ろにバッククォートで囲んだタグを書きます。`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 で保存