主要观点:作者喜欢 Go 语言,但认为其仍有可改进之处,列举了从其他语言中怀念 Go 所缺失的一些特性。
关键信息:
- 标准库中的有序映射:Go 的
map是哈希表,元素顺序随机,缺乏像 Python 中OrderedDict那样的有序映射。Go 1.23 后有了range-over-func,可通过第三方库实现有序映射。 - 函数的关键字和默认参数:Go 缺乏默认参数,影响了标准库的一些 API 设计,如
string.Replace。 - 可空性(nillability):Go 不像 Kotlin 那样支持通用的可空性解决方案,但在很多情况下使用零值而不是
nil减少了nil值的问题,要改变需对语言进行重大修订。 - Lambda 表达式:Go 中使用
func实现匿名函数,语法较繁琐,若有 Lambda 表达式语法会更简洁,此特性仍有讨论且未关闭相关 issue。 - 未使用返回值的错误检查:Go 中忽略错误较常见,若有未使用返回值的警告或错误,能避免一些错误,如
errchecklinter 存在但语言本身不强制。
重要细节:
- Go 的
map随机化每个实例的哈希种子以避免开发者依赖特定迭代顺序。 - 增加有序映射到标准库可减少第三方库的使用摩擦,除非有特定需求才使用第三方库。
- 默认参数可使
string.Replace函数更简洁,无需strings.ReplaceAll。 - 改变可空性可能需要对语言进行重大修订,如 Java 方式添加
nullable类型或像 Dart 那样成功实现空安全,但都有困难。 - Go 1.23 的
range-over-func实验展示了匿名函数的使用方式,Lambda 表达式可简化代码。 - 忽略错误可能导致难以调试的问题,错误检查可提高代码质量,
errchecklinter 存在但不强制。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。