golang中将func转成interface{}的方法
在平常的代码编写中,总有些时候我们内部使用interface的定义,但是提供给其他用户定义的采用接口的方式有些啰嗦,而且用户可能更愿意使用func的方式来进行注册使用。其实从func包装成interface接口也非常方便,例如go内置的http pkg中就有类似的场景。
1. http pkg中的使用
http handler定义如下:
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}
定义一个函数:
func Hello(w ResponseWriter, req *Request) {
fmt.Printf(w, "Hello World")
}
http使用:
http.HandleFunc("/", Hello)
2. 代码流程分析
使用流程分析:
- http.HandleFunc
func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) { DefaultServeMux.HandleFunc(pattern, handler) }
- ServeMux.HandleFunc
// HandleFunc registers the handler function for the given pattern. func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request)) { mux.Handle(pattern, HandlerFunc(handler)) }
- HandlerFunc的定义
type HandlerFunc func(ResponseWriter, *Request) // ServeHTTP calls f(w, r). func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) { f(w, r) }
3. 结论
因此最终将func转成interface接口的关键为 HandlerFunc 的定义,类型定义为一个 func(ResponseWriter, *Request), 但是实现了 ServeHTTP(w ResponseWriter, r *Request) 的接口。