观点:为什么我不想选择Go语言?
极客时间编辑部
讲述:丁婵大小:2.21M时长:04:50
Go 语言可以说是近来风头最盛的编程语言之一。但再好的编程语言也不完美,日前,软件工程师劳伦斯(Lawrence)在博客上发文称,他使用了三年 Go 语言,并在这三年间参与了几个大型 Go 语言项目,但三年后他彻底放弃了 Go 语言,也不打算在新项目中使用 Go 语言。
劳伦斯对 Go 语言的总体印象是“好的方面非常好,不好的方面实在令人无法忍受”。所以他列出了自己不再喜欢 Go 语言的一些理由。这篇文章很快在 HackerNews 上引发了热议。
1. Go 语言使用首字母大小写来决定标识符的可见性
以小写字母开头的标识符在包内可见,以大写字母开头的标识符是公开的。这样做可能是为了省掉 public 和 private 关键字,但是,首字母大写在 Go 语言之前就已经被用来表示其他意思,比如类名的首字母是大写的,常量完全是大写的。
如果开发者要定义私有结构体,情况会变得更加糟糕,因为必须使用小写字母。由于变量的名字跟结构体的名字是一样的,如果编译器也搞不清楚二者,就会抛出编译错误。
2. 在 Go 语言里,结构体不会显式声明它实现了哪些接口,而是通过匹配方法签名来辨别
这种设计犯了一个根本性的错误:它假设两个方法如果有相同的签名就表示有相同的契约。在 Java 中,如果一个类实现了一个接口,它会告诉编译器它实现了接口的所有方法。如果一个方法返回布尔类型,接口的注释会写清楚它的值代表什么意思,比如,true 表示成功,false 表示失败。
但是,Go 语言的结构体可能一方面实现了同样的接口,但返回值的意思却是相反的。具体怎么实现可以自由发挥,因为并没有接口声明约束。在 Go 语言中,一个程序员可能在没有验证方法兼容性的情况下将一个对象转成某个接口,这样很容易引入潜在的 bug。验证兼容性的负担不应该强加给 API 使用者,应该由结构体的实现者承担,并在代码中声明清楚。
3. Go 语言中没有异常,而是通过多个返回值来返回错误
开发者会容易忘记检查返回值里是不是包含了错误。
比如在一个语句中,DELETE 拼写错误,也没有任何消息告诉开发者出了什么问题。如果该语句是一个大型事务的一部分,那么整个事务就什么事都不会做。通过返回值表示错误不是问题,但程序员必须去检查返回值。
4. 因为 Go 语言的首字母大写约定,容易出现很多相同的标识符
比如,一些包名、结构体名和变量名都叫作 item。在 Java 中,包名使用了全限定名,类名首字母是大写的。有时候 Go 代码不好阅读,因为可能无法很快地看出一个标识符的作用域是怎样的。
5. 要进行 Go 代码自动生成并不容易
编译器太过敏感,一些未被使用的导入和变量也会导致构建失败。在生成大型文件时,编译器在一开始可能并不知道需要导入那些包,而且可能出现包名冲突。这种冲突也不好处理,因为即使开发者知道包名,却不知道导入的符号来自哪里。即使开发者知道,生成的代码为了避免冲突也会强制使用别名。在 Java 中,这些问题可以通过使用全限定类名来解决,而在 Go 语言中是不能这样做的。
除了上述 5 个理由外,劳伦斯还列举了 Go 语言没有三元运算符、sort 接口很笨、缺少泛型以及 Go 语言设计者没有完全站在程序员的角度考虑问题等。如果程序很小,使用 Go 语言是没有问题的,如果如果程序很大,那么 Go 语言的类型系统可能不是最佳选择。
此外,在这篇文章登上 HackerNews 后引发了网友的热烈讨论,并两度登上 HackerNews 热度榜。有的网友对作者的观点表示认同,并表示虽然会将 Go 语言作为一种备用的编程语言,但如果没必要就不会再去用它。有的网友则觉得作者提出的大部分缺点都不是问题,并希望 Go 语言保持初心,不要随意修改。
HackerNews 网站讨论:https://news.ycombinator.com/item?id=20166806
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
该免费文章来自《极客视点》,如需阅读全部文章,
请先领取课程
请先领取课程
免费领取
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(9)
- 最新
- 精选
- 看不穿php是世界上最好的语言19
- 杨jxjava平台所采取的演进模式,才是理性与智慧的结晶,才是现代工业领域应该出现的局面。java可以看作是一件设计良好的工业产品,同时也是一架精密的机床,反过来又能很好的服务于产业届。它可能没那么激进没有炫酷的语法,但是这些炫酷存在的必要性本身就值得商榷,有人说它臃肿历史包袱太重,但这正是一件好产品理应具备的兼容性。其他语言加入了太多个人偏好和自以为是,没有很好的遵循工业协作的规律和严谨性!12
- 天海作者提的问题我觉得反而是优点6
- 我来也编程语言各有所长吧。 如果又是一个java,为什么别人要换你的编程语言,难道因为你年轻长得帅?5
- 悟大小写区分可见性、没有全限定名这个有点坑2
- 识空屋把大家当成傻子了,用java的习惯来要挟其他语言,而且还不能让别人去适应别的语言的特性。中国有句名言叫,入乡随俗,此人可以领悟一下。1
- gopherliu一门语言而已,取决于用在什么地方,并不见得所有项目都用go合适,好钢用在刀刃上,把go的优点用在特定项目上也还不错。不过用了四五年go了,感觉还好。1
- 无极代码规范上的事情可以改可以适应,简单易用的并发,难道不值得使用。
- 有风的林子貌似Java才是宇宙真理,威武!霸气。宇宙真理已经发现,其它真理禁止出现。。
收起评论