Go言語で簡単なWebサーバーを作ってみる

以下の図のような、簡単なWebサーバーを作ってみます。
リクエストがWebサーバーに送信されると、要求されたURLをマルチプレクサ(多重通信の入り口 DefaultServeMux)が調べ、リクエストをハンドラにリダイレクトします。
ハンドラはリクエストから情報を取得し、処理します。
f:id:hikotaro_san:20190726103156p:plain


ソースコードは以下となります。

package main

import (
    "fmt"
    "net/http"
)

type MyHandler struct {}
func (h *MyHandler) ServeHTTP(w http.ResponseWriter, *http.Request) {
    fmt.Fprintf(w, "Hello World!")
}

func main() {
    myHandler := MyHandler{}
    server := http.Server{
        Addr: "127.0.0.1:8080",       // (1) 
    }
    http.Handle("/", &myHandler)      // (2)
    server.ListenAndServe()
}


(1) 構造体Structを初期化するとき、Handlerの値を指定しません。これによって、http.DefaultServeMuxをハンドラとして使用することになります。

type Server struct {
    Addr    string  // TCP address to listen on, ":http" if empty
    Handler Handler // handler to invoke, http.DefaultServeMux if nil <-- このコメントで説明されています。
    …
}


(2) http.Handle関数は、DefaultServeMux(ServeMux)のHandleメソッドが呼び出し、URLパターンとハンドラーを登録します。

func Handle(pattern string, handler Handler) { 
    DefaultServeMux.Handle(pattern, handler)  // <-- ここで、DefaultServeMux(ServeMux)のHandleメソッドが呼びだされます。
}


Go言語はしっかりとしたドキュメントが提供されており、ドキュメントから具体的なソースコードを表示することもできるので、プログラムがどのように処理されているか分かりやすいですね。
golang.org