NginxとgolangでAPIサーバー

golangもNginxも始めたばかりなので、他のブログの記事を参考にしつつ試験中

Nginxのconfにlocation追加

golang

ちょっと違う書き方

サーバーの開始

func http.ListenAndServe(addr string, handler Handler) err
http.ListenAndServe(“:81”, nil)

第1引数にTCPアドレス
第2引数にHandlerを引数に受け取りサーバーを起動する。

Handlerというのは、http.Handlerインターフェースを実装していればいい。

ちなみに、内部でhttp.server.ListenAndServeを呼んでいる。http.server.ListenAndServeは内部でhttp.Server.Serveを呼んでいる。http.Server.Serveはforループでリクエストごとにgoroutineを立ち上げる。

http.Handle(r)とは

ServeHTTPメソッドを持つインターフェース。
ServeHTTPはリクエストとレスポンスが記述される。
type Handler interface { ServeHTTP(ResponseWriter, *Request) }

http.Handleとは

func Handle(pattern string, handler Handler)
URLとhttp.Handerを実装した構造体を受け取り、ルータに登録。

http.HandleFuncとは

func HandleFunc(pattern string, handler func(ResponseWriter, *Request))
URLとhttp.Handerを受け取り、ルータに登録。

HandleだとServeHTTPを定義しHandlerを実装した構造体を渡す必要があるが、HandleFuncの場合Funcのまま受け取れる。

http.HandleとHandleFuncについて

http内でDefaultServeMux(ServeMux)が定義されており、DefaultServeMux.Handler、DefaultServeMux.HandleFuncが呼ばれている。

http.ServerMuxとは

ServerMuxはURLとhandlerを登録しておく構造体。
ServeMux自体、ServeHTTPメソッドを実装している→Handler
mux := http.NewServeMux()
mux.Handle(“/echo”, echoHandler)

http.Handle(r)Funcとは

type HandlerFunc func(ResponseWriter, *Request)
func(ResponseWriter, *Request)の別名でServerHTTPが定義(実装)されている。

Handle(r)FuncとHandleFuncについて

そっくりで混乱するが、HandleFuncはURLとHandlerをServerMuxに登録する。Handle(r)Funcの方は、func(ResponseWriter, *Request)の別名でhttp.Handlerとして使える。

http.ServeMux.HandleFuncとは

URLとfunc(ResponseWriter, *Request)を受け取りルータに登録している

内部でfunc(ResponseWriter, *Request)をHandle(r)FuncにキャストしているHandleに登録している。

http.ServerMux.Handleとは

ServeMuxにURLとHandlerを登録する。

出力関係

Print
標準出力へ

Fprint
出力先を指定

Sprint
文字列で返す。

接尾のfはフォーマット