我想在Go 2.0中看到什么? - sethvargo

22-01-18 banq

Go 是我最喜欢的编程语言之一,但它仍然远非完美。在过去的 10 年里,我使用 Go 来构建小型项目和大型应用程序。虽然该语言与 2009 年的原始版本相比有了很大的发展,但这篇文章强调了一些我认为 Go 仍有改进空间的领域。
 

现代模板引擎
Go 标准库有两个模板包:text/templatehtml/template. 它们使用大致相同的语法,但html/template处理实体转义和一些其他特定于 Web 的构造。不幸的是,对于没有大量开发人员投资的足够高级的用例来说,这两个包都不适合或足够强大。
 

改进range以免复制值
虽然它有很好的文档记录,但是range子句中的值被复制总是出乎意料的。
 
确定性 select
在一个select语句的多个条件为真的情况下,获胜的情况是 undefined。这是一个非常微妙的错误来源,并且看起来相似的switch声明会加剧这种情况,该声明确实按照编写顺序进行评估。
 

结构化日志接口
Go 的标准库包含这个log包,它非常适合基本使用。但是,大多数生产系统都需要结构化日志记录,而Go 中不乏结构化日志记录库:



Go 在这个领域缺乏意见导致了这些包的泛滥,其中大多数具有不兼容的功能和签名。
Go 标准库需要定义一个结构化的日志接口,所有这些现有的上游包都可以选择实现该接口。
 

多错误处理
在很多情况下,特别是对于后台作业或周期性任务,系统可能会并行处理事物或继续出错。在这些情况下,返回多重错误会很有帮助。标准库中没有对处理错误集合的内置支持。
围绕多错误处理拥有清晰简洁的标准库定义可以统一社区并降低错误处理不当的风险,正如我们在错误包装和展开中看到的那样。
  

JSON序列号 error
 

标准库中不再有公共变量
仅举一个例子,http.DefaultClient和http.DefaultTransport都是具有共享状态的全局变量。http.DefaultClient没有配置超时,这使得DOS 自己的服务变得微不足道并造成瓶颈。许多包会发生变异如http.DefaultClient,http.DefaultTransport,这可能会浪费数天的开发人员资源来追踪错误。
Go 2.0 应该将它们设为私有并通过函数调用公开它们,该函数调用返回所讨论变量的唯一分配。或者,Go 2.0 可以实现“冻结”全局变量,这样它们就不会被其他包改变。
 

对缓冲渲染器的本机支持

点击标题见原文
本文作者Seth Vargo 是Google的一名工程师。此前,他曾在 HashiCorp、Chef Software、CustomInk 和一些匹兹堡的初创公司工作。他是Learning Chef的作者,热衷于减少技术上的不平等。当他不写作、从事开源工作、教学或在会议上发言时,Seth 会为非营利组织提供建议。