template.HTMLEscape
和 template.JSEscape
分别接受一个 io.Writer
并写入它。然而,它们忽略了来自 Write
的错误。
当目标 io.Writer
是一个不能失败的(如 *bytes.Buffer
),这没问题,但通常会掩盖实际错误(参见 #20803 (评论))。
调用者可以通过 Package io.Writer
来检测这些错误,但是 Package 一个 io.Writer
以捕获它已经无谓地返回的错误会使代码变得复杂。
这些函数应该返回错误,并将是否可以安全忽略这些错误的决定留给调用者。
兼容性
这个更改将在调用站点兼容(使绝大多数调用者保持不变),但会破坏将 template.HTMLEscape
或 template.JSEscape
作为 func(io.Writer, []byte)
传递或分配的程序。这样的用法应该很少见。
作为替代方案,我们可以添加那些返回错误的函数的变体;然而,单独的变体会掩盖分析工具中缺失的错误检查。我认为在 Go 2 清理中简单地更改签名会更好。
2条答案
按热度按时间2hh7jdfx1#
(CC @robpike@mvdan)
ma8fv8wu2#
听起来不错。我认为对于Go2,我们应该审查标准库,并考虑修复所有接受
io.Writer
但不返回错误的函数和方法。我想知道我们是否应该对其他参数类型(如io.Reader
)做同样的处理。