GolangのHTTPサーバーのコードリーディング

概要

この記事はQiita - Go6 Advent Calendar 2019の20日目の記事です。

GolangでHTTPサーバーを立てるコードの詳細を追ってコードリーディングします。

参考実装

コードリーディングしていく実装はこちら。

冗長に書いているこのコードを一行ずつ追ってコードを簡略化しつつ、リーディングしていきます。

ServeHttp(w ResponseWriter, r *Request)

まずは、

この部分から見ていきます。

ServeHTTP(w ResponseWriter, r *Request)Handlerインターフェースの実装になります。

参考実装では、ServeHTTP(w ResponseWriter, r *Request)のためにHelloHandler構造体を用意していますが、 HandlerFuncを利用することでより簡潔に書き直すことができます。

参考実装を書き直すとこんな感じです。

ServeHTTP(w ResponseWriter, r *Request)を使っていた部分を書き換えることができました。

ちなみにmux.Handleの中身はこんな実装になっています。

ServeMux

先程短くした部分を更に見ていきます。

mux.Handle("/", http.HandlerFunc(hello))の部分はHandleFuncを使うと一部を内部的に処理させることができるので、 より短く書くことができます。

上記を加味して書き直すとこんな感じになります。

DefaultServeMuxは、内部的にはServeMux構造体のポインタが格納された変数になります。 HandleFuncDefaultServeMuxへのurlパターンマッチの登録ができるメソッドになっています。

Server

最後に見ていくのはこの部分。

s.ListenAndServe()の中身。

Serverに細かい設定値を与える必要がないときはListenAndServe()を使うことで短く書くことができる。 Serverの設定値についてはgolang.org - server.goを参照。

短く書くとこんな感じです。

無名関数を使って使うとこんな感じです。

所感

golangでhttp routerのパッケージを自作しようとしていて、net/httpの内部的な実装に触れておく必要があったので軽く調べてみました。 見た感じ拡張しやすそうなので自作はしやすいイメージがあります。

追記

URLルーター実装しました。

github.com - bmf-san/goblin

参考