Go by Example: HTTP Servers

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 を受け取ります。 ResponseWriter は、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

Next example: Context.