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%