关于"net/http"包中ResponseWriter接口的疑问

在使用net/http包时,创建处理器函数,需要传入http.ResponseWriter接口,但是对ResponseWriter接口的应用一直没搞明白
代码如下:

func process(w http.ResponseWriter, r *http.Request) {
    t, _ := template.ParseFiles("tmp.html")
    t.Execute(w, "hello world")
}
func main() {
    server := http.Server{
        Addr: "127.0.0.1:8080",
    }
    http.HandleFunc("/process", process)
    server.ListenAndServe()
}

Template的Execute方法定义如下:

func (t *Template) Execute(wr io.Writer, data interface{}) error {
    if err := t.escape(); err != nil {
        return err
    }
    return t.text.Execute(wr, data)
}

Execute接受io.Writer是接口类型,ResponseWriter也是接口类型,他们怎么连接起来的,ResponseWriter具体是怎么工作的?
请大家帮忙指点下,谢谢!!!

阅读 3.2k
1 个回答
  1. golang 对接口的实现,不需要显示的申明,只要实现了接口定义的方法,那就实现了响应的接口。
  2. io.Writer 是一个接口类型, 需要实现 Write(p []byte) (n int, err error) 方法即可
  3. http.ResponseWriter 接口的定义如下:
type ResponseWriter interface {
    Header() Header
    Write([]byte) (int, error)
    WriteHeader(statusCode int)
}

那只要实现了http.ResponseWriter, 就必然会实现io.Writer 接口。

所以,ResponseWriter 的实现,必然是一个 io.Writer 的实现,那也显而易见的可以使用Execute 方法了。


ResponseWriter 的接口抽象,其实有很多个实现的,例如:

  1. http.response 这个就是process 方法里面的 实现。
  2. fcgi.response
  3. cgi.response

如果希望详细了解下执行过程,可以通过打断点的方式抛下。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题