为什么http.ResponseWriter是interface,但是http.Request是struct啊

http库设计中,为什么http.ResponseWriter是interface,但是http.Request是struct啊

已邀请:

chenqinghe

赞同来自: heramerom huahua

大致看了下源码,说的不一定对,轻喷。

  1. 首先说为啥http.ResponseWriter是interface。因为不光是http/1.1,还有http/2,这两者业务逻辑是相同的,但是底层的处理是不同的,所以要抽象出一个interface来屏蔽底层实现。在net/http/server.go:1847 行,ServeHTTP方法传入的是个http.response,但在net/http/h2_bundle.go:5877 行中 ,是个http.http2responseWriter,因此要是interface。

  2. 至于为什么http.Request为什么不是interface,一方面是因为没必要,既然使用结构体已经能解决问题,就没必要搞个interface来徒增类型转换的成本了;另一方面是有些时候会需要改动request里的字段内容,比如说request.URL.Path,这个时候就需要接口里面多定义很多不一定能用到的方法,这样,接口里要考虑的函数就太多了,所以是个struct。

lrita

赞同来自:

大概是为了偷懒吧,不然得写很多getter,而且request在callback中基本上是只读的,没有mock需求。

要回复问题请先登录注册