1. health
  2. items
  3. version
  4. 登録していないパス
コース一覧
Go入門
ルーティング

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分

ルーティング

パスごとに処理を分ける

エンドポイントが増えると、ハンドラを1つずつ登録します。この登録を受け持つのが ServeMux です。

Go

mux := http.NewServeMux() mux.HandleFunc("/health", healthHandler) mux.HandleFunc("/items", itemsHandler) http.ListenAndServe(":8080", mux)

mux は multiplexer(振り分け役)の略です。届いたリクエストのパスを見て、対応するハンドラへ渡します。

前方一致に注意

Go

mux.HandleFunc("/items", itemsHandler) // /items だけ mux.HandleFunc("/items/", itemsHandler) // /items/ で始まる全部

末尾のスラッシュで意味が変わります。 付けると前方一致になり、/items/1 も /items/abc/def も同じハンドラに届きます。

詳細ページを作るときはこれを使います。/items/1 の 1 は自分で取り出します。

メソッドつきで登録できる

Go 1.22 から、メソッドとパスパラメータをまとめて書けるようになりました。

Go

mux.HandleFunc("GET /items", listHandler) mux.HandleFunc("POST /items", createHandler) mux.HandleFunc("GET /items/{id}", detailHandler)

{id} の部分は、ハンドラの中で取り出せます。

Go

id := r.PathValue("id")

これが入るまでは、パスを自分で切り分けるか、外部のライブラリを使うのが普通でした。標準ライブラリだけで書ける範囲が広がった変更です。

このコースでは前者の書き方も扱います。 実務のコードにはどちらも残っているためです。

登録されていないパス

ServeMux は、どれにも当てはまらないパスに自動で 404 を返します。自分で書く必要はありません。

プレーンテキスト

GET /unknown → 404 page not found

本文が page not found という決まった文言になります。JSON を返す API では、この既定の応答が混ざると扱いにくいので、後のレッスンで自分の形に揃えます。

このコースでの確かめ方

httptest では mux を直接呼べます。

Go

mux := http.NewServeMux() mux.HandleFunc("/health", healthHandler) req := httptest.NewRequest("GET", "/health", nil) rec := httptest.NewRecorder() mux.ServeHTTP(rec, req)

ハンドラを直接呼ぶ代わりに mux.ServeHTTP を呼びます。振り分けまで含めて試せるので、パスの登録が正しいかも確かめられます。

要件

  1. http.NewServeMux() で mux を作る
  2. /health /items /version の3つを登録する
  3. それぞれ ok items 1.0.0 を返す
  4. 登録していないパスは ServeMux に任せる

入出力例

callRoute("/health") → "200 ok" callRoute("/items") → "200 items" callRoute("/version") → "200 1.0.0" callRoute("/unknown") → "404"

ヒント

`/health` の登録が手本になっています。同じ形で2つ足してください

`mux.HandleFunc("/items", func(w http.ResponseWriter, r *http.Request) { ... })` の形です

404 の処理は書かないでください。ServeMux が自動で返します

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

関連レッスン

  • 一覧API

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

  • 詳細APIと404

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

  • 出品API

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

  • つくる: API主要部完成

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

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

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

  • 処理計算や代入を表す長方形
  • エンドポイント「この URL を叩くとこの機能が動く」入口の住所
  • リクエストWeb 通信の基本単位、ブラウザの問い合わせとサーバーの返答
  • メソッドクラスに属する関数
  • 標準ライブラリPythonに同梱の公式モジュール群
  • applicationJSON 本文を送るときの Content-Type
  • APIアプリ間でデータをやり取りする窓口
main.go
学習モード
エディタを読み込んでいます

メモ

ルーティング

⌘S で保存