Go による例: HTTP サーバー

net/http パッケージを使用することで、基本的な HTTP サーバーを簡単に記述できます。

package main
import (
    "fmt"
    "net/http"
)

net/http サーバーの基本的な概念は ハンドラー です。ハンドラーは http.Handler インターフェースを実装するオブジェクトです。ハンドラーを記述する一般的な方法は、適切なシグネチャを持つ関数に http.HandlerFunc アダプターを使用することです。

func hello(w http.ResponseWriter, req *http.Request) {

ハンドラーとして機能する関数は、引数として http.ResponseWriterhttp.Request を取ります。レスポンスライターは HTTP レスポンスを埋めるために使用されます。ここでは、単純なレスポンスは「hello\n」だけです。

    fmt.Fprintf(w, "hello\n")
}
func headers(w http.ResponseWriter, req *http.Request) {

このハンドラーは少し高度なことを行い、すべての HTTP リクエストヘッダーを読み込み、レスポンスボディに出力します。

    for name, headers := range req.Header {
        for _, h := range headers {
            fmt.Fprintf(w, "%v: %v\n", name, h)
        }
    }
}
func main() {

便利な関数 http.HandleFunc を使用して、サーバールートにハンドラーを登録します。net/http パッケージの デフォルトルーター を設定し、引数として関数を取得します。

    http.HandleFunc("/hello", hello)
    http.HandleFunc("/headers", headers)

最後に、ポートとハンドラーで ListenAndServe を呼び出します。nil は、設定したばかりのデフォルトルーターを使用するように指示します。

    http.ListenAndServe(":8090", nil)
}

サーバーをバックグラウンドで実行します。

$ go run http-servers.go &

/hello ルートにアクセスします。

$ curl localhost:8090/hello
hello

次の例: Context です。