1. 一覧が一致する
  2. 404 が一致する
  3. 0件のとき null を返す実装とは一致しない
  4. エラー文言が違うと一致しない
コース一覧
Go入門
Node版と差し替える

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分

Node版と差し替える

中身を入れ替えても気づかれない

前のレッスンで、仕様どおりの API ができました。同じ仕様の実装が2つある状態です。

プレーンテキスト

fleama API (Node.js) いま動いているもの fleama-go (Go) いま作ったもの

差し替えとは、使う側を一切変えずに、裏側だけを入れ替えることです。

プレーンテキスト

React アプリ → fetch("/items") → [Node版] React アプリ → fetch("/items") → [Go版] ← 変えたのはここだけ

フロント側のコードは1行も触りません。触る必要があるなら、それは互換ではなかったということです。

一致を機械で確かめる

「同じはず」で切り替えると事故ります。同じリクエストを両方に投げて、応答を突き合わせます。

プレーンテキスト

GET /items 両方の応答が一致するか GET /items/1 一致するか GET /items/99 404 と本文が一致するか POST /items 検証NG 400 と理由が一致するか

見るのは3つです。

プレーンテキスト

ステータスコード 応答の本文(1文字単位) ヘッダ(Content-Type など)

成功する場合だけ確かめて安心しないでください。差が出やすいのは、むしろ失敗のときです。エラーの文言、404 の形、検証の順番。ここが揃っていないと、使う側の分岐が壊れます。

よくある食い違い

実際に作り直すと、次のあたりでずれます。

プレーンテキスト

0件のとき null と [] 数値の表現 1200 と "1200" キーの順番 言語やライブラリによって変わることがある 日時の形式 Node と Go で既定が違う 末尾の改行 Encode を使うと付く

どれも第8章で触れたものです。細部が全部合って初めて互換になります。

切り替えの進め方

実務では、一度に全部を切り替えません。

プレーンテキスト

1. 両方を動かし、同じリクエストを両方に流して比べる 2. 一部のリクエストだけ Go 版に向ける 3. 問題が無ければ割合を増やす 4. 全部を切り替え、Node 版を止める

途中で戻せるようにしておくのが要点です。戻せない切り替えはやらない、というのが、この種の作業の原則になります。

この演習でやること

2つの実装の応答を比べる関数を書きます。差し替えの前に必ずやる作業を、そのまま小さくしたものです。

要件

  1. callGo を呼んで Go 版の応答を得る
  2. Node 版の応答と1文字単位で比べる
  3. 一致したら 一致 を返す
  4. 違ったら 不一致 期待=<Node版> 実際=<Go版> を返す

入出力例

compareImpl("GET", "/items?keyword=中古スマホ", "", "200 {"total":1,"items":[{"id":2,"name":"中古スマホ","price":24800}]}") → "一致" compareImpl("GET", "/items/99", "", "404 {"error":"not found"}") → "一致" compareImpl("GET", "/items?keyword=謎の箱", "", "200 {"total":0,"items":null}") → "不一致 期待=200 {"total":0,"items":null} 実際=200 {"total":0,"items":[]}" compareImpl("GET", "/items/abc", "", "400 {"error":"bad request"}") → "不一致 期待=400 {"error":"bad request"} 実際=400 {"error":"invalid id"}"

ヒント

`goResponse := callGo(method, path, body)` で Go 版の応答を得ます

比較は `==` で1文字単位です。JSON として解釈し直す必要はありません

不一致のときの形は `不一致 期待=%s 実際=%s` です。期待が Node 版、実際が Go 版です

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

関連レッスン

  • 1バイナリでデプロイ

    go buildで作った1つのバイナリをサーバーに置き、常駐させる手順を説明できるようになります。

  • 自由拡張

    欲しいAPIを自分で設計して実装し、並行処理を活かした集計APIを1本作れるようになります。

  • 完成と次のステップ

    fleama-goの完成を確かめ、次に学ぶものを自分で選べるようになります。

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

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

  • エンドポイント「この URL を叩くとこの機能が動く」入口の住所
  • APIアプリ間でデータをやり取りする窓口
  • リクエストWeb 通信の基本単位、ブラウザの問い合わせとサーバーの返答
  • 関数処理に名前を付けて再利用できる単位
main.go
学習モード
エディタを読み込んでいます

メモ

Node版と差し替える

⌘S で保存