golang中将func转成interface{}的方法

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. 代码流程分析

使用流程分析:

  1. http.HandleFunc
    func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
        DefaultServeMux.HandleFunc(pattern, handler)
    }
    
  2. 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))
    }
    
  3. 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) 的接口。

发表评论

电子邮件地址不会被公开。 必填项已用*标注