3 回答
TA贡献1833条经验 获得超4个赞
您得到的w
是指向非导出类型的指针,http.response
但与ResponseWriter
接口一样,这是不可见的。
type ResponseWriter interface { ...}
另一方面,r
它是指向具体结构的指针,因此需要显式传递引用。
type Request struct { ...}
TA贡献1835条经验 获得超7个赞
正如此处和其他地方的许多其他答案中正确提到的那样,它ResponseWriter
是一个界面,其含义已在SO答案和博客中进行了详细描述。
我要解决的是我的感觉,这是一个巨大且危险的误解,原因是请求是通过“引用”传递的(尽管这样的事情在Go中实际上并不存在)是“我们想要进行更改使其对服务器可见”。
引用几个答案:
[..]它只是一个结构,因为我们想改变这个结构,并在Web服务器看到这些变化,它必须是一个指针[..] SO
[..]处理程序对Request的更改需要对服务器可见,因此我们仅通过引用而不是通过值来传递[..] SO
这是错误的; 实际上,文档明确警告不要篡改/更改请求:
除读取正文外,处理程序不应修改提供的请求。
相反,不是吗?:-)
如果要更改请求,例如在将跟踪标头传递给中间件链中的下一个处理程序之前附加跟踪标头,则必须复制请求并将复制的版本向下传递给链。
Go团队提出了更改行为以允许修改传入请求的请求,但更改此类内容可能会导致至少某些现有代码意外中断。
如果我们明确告诉人们不要更改请求,为什么还要使用指针?性能,Request
是一个大的结构,并复制它可以带来性能的下降,尤其是在考虑长期中间件链。团队必须权衡利弊,这绝对不是理想的解决方案,但是这里的权衡显然是性能方面的问题(而不是API安全性)。
- 3 回答
- 0 关注
- 542 浏览
添加回答
举报