0%

go源码分析——HandlerFunc

1. http.Handle(“/“,<Handle类型>)

第二个参数是一个接口,需要通过实现ServeHTTP完成,也就是说只要实现了 ServeHTTP(ResponseWriter, *Request) 就是Handler类型

源码如下

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

这里注意:DefaultServeMux.Handle(pattern, handler)

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

实现示例:

package main

import (
	"net/http"
	"log"
)

type httpServer struct {
}

func (server httpServer) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte(r.URL.Path))
}

func main() {
	var server httpServer
	http.Handle("/", server)
	http.ListenAndServe("localhost:9000", nil)
}

可是这样太麻烦,不同逻辑的Handler我们都要通过结构体绑定重构一次,我们需要一个像函数一样任意创建使用的Handler,HandleFunc便出现了

2. http.HandleFunc(“/“, <func(ResponseWriter, *Request)类型>)

第二个参数是一个方法,源代码如下

func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
   DefaultServeMux.HandleFunc(pattern, handler)
}

为什么这样写呢,继续看DefaultServeMux.HandleFunc(pattern, handler)方法:

func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
   if handler == nil {
      panic("http: nil handler")
   }
   mux.Handle(pattern, HandlerFunc(handler))
}

通过ServeMux绑定的HandleFunc() 实现了 mux.Handle(pattern, HandlerFunc(handler)),HandlerFunc(handler)的源码如下

type HandlerFunc func(ResponseWriter, *Request)

// ServeHTTP calls f(w, r).
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
   f(w, r)
}

可以看出HandlerFunc(ResponseWriter, *Request)方法为实现了ServeHTTP 的Handle接口,并且运行了HandlerFunc方法,而只要实现了该方法就是实现了Hanler接口,就可以运行.Handle()方法

mux.Handle(pattern, HandlerFunc(handler))的的源码与DefaultServeMux.Handle(pattern, handler)的源码一样都是:

func (mux *ServeMux) Handle(pattern string, handler Handler)

那这是为什么呢?

原因很简单,其实DefaultServeMux就是ServeMux类型的指针

// DefaultServeMux is the default ServeMux used by Serve.
var DefaultServeMux = &defaultServeMux

var defaultServeMux ServeMux

总结:

http.HandleFunc()是由实现了Handler接口的方法类型HandleFunc func(w ResponseWriter, r *Request)实现的可自定义handler方法调用

-------------本文结束感谢您的阅读-------------
打赏一瓶矿泉水