1. health に応答する
コース一覧
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分

サーバーを立てる

標準ライブラリだけで立つ

Go

package main import "net/http" func main() { http.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("ok")) }) http.ListenAndServe(":8080", nil) }

これだけで HTTP サーバーが動きます。何も追加でインストールしていません。 net/http は Go に最初から入っています。

Node.js で Express を入れ、設定を書いてから始めたのと比べると、出発点が違います。Go では標準ライブラリだけで本番のサーバーを書くことも珍しくありません。

2つの登場人物

Go

func(w http.ResponseWriter, r *http.Request)

この形が、Go のハンドラです。

プレーンテキスト

w 応答を書く先。ここに書いたものが相手に届く r 届いたリクエスト。パスやメソッドや本文が入っている

r にポインタが付いているのは、リクエストが大きいのでコピーを避けるためです。第6章のポインタレシーバと同じ理由です。

応答を書く

Go

w.Write([]byte("ok"))

Write はバイト列を受け取ります。文字列をそのままは渡せないので、[]byte(...) で変換します。第2章でやった明示的な型変換です。

ステータスコードを指定するときは、書く前に呼びます。

Go

w.WriteHeader(404) w.Write([]byte("not found"))

順番が逆だと効きません。Write を先に呼んだ時点で 200 が確定してしまいます。第8章で 404 を返すときに、必ず引っかかる場所です。

このコースでの確かめ方

実際にサーバーを起動すると、止めるまでプログラムが終わりません。採点ができないので、このコースでは httptest を使います。

Go

import "net/http/httptest" req := httptest.NewRequest("GET", "/health", nil) rec := httptest.NewRecorder() handler(rec, req) // rec に応答が記録されている

偽のリクエストを作り、偽の記録係に応答を書かせます。サーバーを起動せずにハンドラだけを試せるので、テストの定番です。実務でもこの形で書きます。

記録された内容はこう取り出します。

Go

res := rec.Result() res.StatusCode // 200 body, _ := io.ReadAll(res.Body) string(body) // ok

要件

  1. healthHandler が本文に ok を書く
  2. ステータスコードは 200(明示しなければ 200 になる)
  3. callHealth は ステータス 本文 の形を返す

入出力例

callHealth() → "200 ok"

ヒント

`healthHandler` の中に `w.Write([]byte("ok"))` の1行を書きます

文字列をそのまま `w.Write("ok")` と渡すとコンパイルエラーになります。`[]byte(...)` で変換してください

ステータスコードを書かなければ、自動的に 200 になります

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

関連レッスン

  • ハンドラ関数

    ResponseWriterとRequestを受け取る関数を書き、/healthを実装できるようになります。

  • JSONを返す

    構造体タグを付けてJSONに変換し、Itemをきれいなキー名で返せるようになります。

  • ルーティング

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

  • 一覧API

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

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

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

  • 標準ライブラリPythonに同梱の公式モジュール群
  • HTTPWeb の通信プロトコル、HTTPS は TLS で暗号化したもの
  • サーバークライアント(ブラウザなど)がリクエストを送り、サーバーがレスポンスを返す。
  • Node.jsJavaScript をサーバ側で動かすランタイム
  • リクエストWeb 通信の基本単位、ブラウザの問い合わせとサーバーの返答
  • 型変換あるデータ型を別の型に変換すること。
  • ステータスコード200/201/404 など結果を示す3桁の数値
  • テストバグを見つける工程
main.go
学習モード
エディタを読み込んでいます

メモ

サーバーを立てる

⌘S で保存