golang 特别“别扭”的地方,或者说是特色
尽管 Go 语言在很多方面设计得相当精巧,但仍有一些特性或限制可能让部分开发者觉得 “别扭” 或需要时间适应。
下面是一些常见的讨论点:
1. 错误处理:
Go 语言没有异常机制,而是通过返回错误值的方式来处理错误。
这意味着在很多函数调用后都需要检查错误,可能会导致代码中出现大量的错误检查逻辑,有时显得冗长。
2. 类型系统限制:
Go 缺乏泛型,直到 Go 1.18 版本才正式引入泛型支持。golang 泛型的格式写法。
在此之前,为不同类型编写通用代码时,可能需要复制粘贴或者使用接口和类型断言,增加了代码量和维护难度。
3. 依赖管理历史问题:
虽然现在有了官方的 go mod 来管理依赖,但在早期,Go 的依赖管理方案(如 Glide、Dep 等第三方工具)相对混乱,给开发者带来了一些困扰。
4. 接口实现不透明:
接口实现是隐式的,这简化了代码,但也可能导致不小心实现了某个接口,或者难以从代码中直接看出哪些类型实现了哪些接口。
5. 初始化顺序:
包级别的初始化函数(通过 init 函数)按照导入包的顺序执行,这可能导致不易预测的初始化顺序,尤其是在大型项目中。
6. 反射的局限性:
虽然 Go 支持反射,但与一些动态语言相比,反射功能相对有限,尤其是在修改变量值或调用非导出函数方面。
7. 缺少某些现代语言特性:
如上所述,直到较晚版本才加入泛型,且没有类和继承、运算符重载、默认参数等特性,这些在某些场景下可能会限制表达能力。
这些 “别扭” 之处并不意味着 Go 语言设计不佳,而是反映了任何语言设计都需在各种权衡中做出选择。
开发者根据具体需求和偏好,可能会有不同的感受。