Goのnet/httpでサーバーのハンドラー処理を作ってみる

Go

net/httpパッケージを使って、サーバーのハンドラー処理を書いてみた。

handler1、handler2、handler3、handler4、どれも書き方は若干違うが、最終的にhttp.Handle()が呼び出され、ルーティングが登録されるため同義となる。

http.Handle()の第2引数では、http.Handler型が指定されており、http.Handlerはインターフェイスで、ServeHTTPメソッドの実装を期待しているので、それを実装した型を入れてやると動く。

http.HandlerFunc()は、http.ResponseWriterと*http.Requestを引数に持つ関数が指定されており、実行するとhttp.HandlerインターフェイスのServeHTTPメソッドを実装した、http.HandlerFunc型になるので、それをhttp.Handle()に渡す。

package main

import (
	"net/http"
)

type handler3 struct{}

func (h *handler3) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte("Test Handler 3"))
}

func handler4(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte("Test Handler 4"))
}

func main() {
	handler1 := func(w http.ResponseWriter, r *http.Request) {
		w.Write([]byte("Test Handler 1"))
	}
	http.HandleFunc("/test1", handler1)

	handler2 := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		w.Write([]byte("Test Handler 2"))
	})
	http.Handle("/test2", handler2)

	handler3 := &handler3{}
	http.Handle("/test3", handler3)

	http.HandleFunc("/test4", handler4)

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

動かしてみる

go run main.go

curl http://localhost:8080/test1
Test Handler 1%

curl http://localhost:8080/test2
Test Handler 2%

curl http://localhost:8080/test3
Test Handler 3%

curl http://localhost:8080/test4
Test Handler 4%