0
0

More than 5 years have passed since last update.

http.Handle、http.Handlerの違いをまとめてみた。

Last updated at Posted at 2019-07-25

ここ数日golangを触ってるけど、この2つが理解できなかったので再度まとめてみます。

DefaultServerMuxとは

まず、違いを抑えるために知らなければいけないのがDefaultServerMuxです。その名の通り、デフォルトで使用されるServeMuxです。
ServeMuxは、要求されたURLを元に、どのページを表示すべきなのか判断してくれます。

http.Handleとhttp.Handlerの違いって何なんだよ

http.Handler:インターフェース(ResponseWriterと*Requestを引数に取るServeHttpメソッドさえあれば全部Handlerとして扱える!)

server.go
type Handler interface {
    ServeHTTP(ResponseWriter, *Request)
}

http.Handle:メソッド(DefaultServeMux.Handleのラッピング)

server.go
func Handle(pattern string, handler Handler) { DefaultServeMux.Handle(pattern, handler) }

DefaultServeMux.Handle:メソッド(パターン(URL)とHandlerを紐づける!)

server.go
// Handle registers the handler for the given pattern.
// If a handler already exists for pattern, Handle panics.
func (mux *ServeMux) Handle(pattern string, handler Handler) {
    mux.mu.Lock()
    defer mux.mu.Unlock()

    if pattern == "" {
        panic("http: invalid pattern")
    }
    if handler == nil {
        panic("http: nil handler")
    }
    if _, exist := mux.m[pattern]; exist {
        panic("http: multiple registrations for " + pattern)
    }

    if mux.m == nil {
        mux.m = make(map[string]muxEntry)
    }
    e := muxEntry{h: handler, pattern: pattern}
    mux.m[pattern] = e
    if pattern[len(pattern)-1] == '/' {
        mux.es = appendSorted(mux.es, e)
    }

    if pattern[0] != '/' {
        mux.hosts = true
    }
}

DefaultServeMux.Handleが呼ばれることで、ようやく「このURLが飛んで来たら、このHandlerを使ってね!」みたいな紐づけができるようになる。

この記事のまとめ

DefaultServeMux.Handleが(http.Handleを経由して)http.Handlerを登録するんです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0