Go2.0 应该将这些全局变量设为私有 , 并通过函数调用来公开它们 , 而这个函数的调用会返回一个唯一的已分配好的变量 。 或者 , Go 2.0 也可以实现一种“冻结”的全局变量 , 这种全局变量无法被其他包修改 。
从软件供应链的角度来看 , 这类问题也令我很担忧 。 如果我开发一个包 , 秘密地修改 http.DefaultTransport , 然后使用自定义的 RoundTripper , 将所有流量都转发到我的服务器 , 那就麻烦了 。
缓冲渲染器的原生支持
有些问题是因为不为人知或没有文档记录 。 大多数示例 , 包括 Go 文档中的示例 , 都应该按照以下行为进行JSON序列化或通过 Web 请求呈现 HTML:
func toHTML(w http.ResponseWriter, tmpl string, i interface{}) {if err :=templates.ExecuteTemplate(w, tmpl, i); err != nil {http.Error(w,"oops", http.StatusInternalServerError)}}
然而 , 对于上述两段代码 , 如果 i 足够大 , 则在发送第一个字节(和 200 状态代码)后 , 编码/执行就可能会失败 。 此时 , 请求是无法恢复 , 因为无法更改响应代码 。
为了解决这个问题 , 广泛接受的解决方案是先渲染 , 然后复制到 w 。 这个解决方案仍然有可能引发错误(由于连接问题 , 写入 w 失败) , 但可以确保在发送第一个字节之前编码/执行成功 。 但是 , 为每个请求分配一个字节切片可能会很昂贵 , 因此通常都会使用缓冲池 。
这种方法非常罗嗦 , 并且将许多不必要的复杂性推给了实现者 。 相反 , 如果 Go 能够使用 EncodePooled 之类的函数 , 自动处理这个缓冲池管理就好了 。
总结
Go是我最喜欢的编程语言之一 , 这就是为什么我愿意说出自己的一些批评意见 。 与其他编程语言一样 , Go 也在不断发展 。 你赞同本文指出的这些问题吗?请在下方留言 。
参考链接:
https://www.sethvargo.com/what-id-like-to-see-in-go-2/
《新程序员003》正式上市 , 50余位技术专家共同创作 , 云原生和数字化的开发者们的一本技术精选图书 。 内容既有发展趋势及方法论结构 , 华为、阿里、字节跳动、网易、快手、微软、亚马逊、英特尔、西门子、施耐德等30多家知名公司云原生和数字化一手实战经验!
?IT = 加班多?外国小哥打破“魔咒”:“每天工作 10 分钟 , 工资近 9 万美元!”
?WebAssembly崛起 , Kubevirt成主流 , 2022年云原生的五大发展趋势
? 从“去IOE”的替代到开源创新 , 国产数据库的 2021 年
特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
