Open7

Go Start HTTP Server

xion6xion6

http.ListenAndServe 関数

http.ListenAndServe 関数は第1引数のアドレス文字列と第2引数のハンドラーを使って HTTP サーバーを起動する

err := http.ListenAndServe(
	":18080",
	http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "Hello, %s!", r.URL.Path[1:])
	}),
)

if err != nil {
	fmt.Printf("failed to terminate server: %v", err)
	os.Exit(1)
}
xion6xion6

*http.Server 型の ListenAndServe メソッド

s := &http.Server {
	Addr: ":18080",
	Handler: http.HandlerFunc(func(w http.ResponseWriter, r * http.Request) {
		fmt.Fprintg(w, "Hello, %s!", r.URL.Path[1:])
	}),
}
err := s.ListenAndServe()

*http.Server 型の ListenAndServe メソッドは HTTP サーバー起動の定番であり、以下の特長がある

  • Shutdown メソッドが実装されている
  • サーバータイムアウト時間を柔軟に設定できる
xion6xion6

ピリオドを使った構造体のメンバーアクセスでは デリファレンス が自動で行われるので、以下のようにしても問題ない

s.Addr = ":18080"

xion6xion6

*http.Server 型の Serve メソッド

net.Listen 関数でリッスンを開始しておくのがポイント

l, err := net.Listen("tcp", ":"+"18888")
if err != nil {
	log.Fatalf("failed to listen port %s: %v", p, err)
}

s := &http.Server{
	Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "Hello, %s!", r.URL.Path[1:])
	}),
}
err := s.Serve(l)