【GoLang】转载:我为什么放弃Go语言,哈哈
我为什么放弃Go语言
作者:庄晓立(Liigo)
日期:2014年3月
原创链接:http://blog.csdn.NET/liigo/article/details/23699459
转载请注明出处:http://blog.csdn.Net/liigo
有好几次,当我想起来的时候,总是会问自己:我为什么要放弃Go语言?这个决定是正确的吗?是明智和理性的吗?其实我一直在认真思考这个问题。
开门见山地说,我当初放弃Go语言(golang),就是因为两个“不爽”:第一,对Go语言本身不爽;第二,对Go语言社区里的某些人不爽。毫无疑问,这是非常主观的结论。但是我有足够详实的客观的论据,用以支撑这个看似主观的结论。
文末附有本文更新日志。
第0节:我的Go语言经历
在上一个10年,我(Liigo)在我所属的公司里,深度参与了两个编程语言项目的开发。我想,对于如何判断某个编程语言的优劣,或者说至少对于如何判断某个编程语言是否适合于我自己,我应该还是有一点发言权的。
[1]: https://plus.google.com/+LiigoZhuang/posts/CpRNPeDXUDW
[2]: http://blog.csdn.net/liigo/article/details/7467309
第1节:我为什么对Go语言不爽?
Go语言有很多让我不爽之处,这里列出我现在还能记起的其中一部分,排名基本上不分先后。读者们耐心地看完之后,还能淡定地说一句“我不在乎”吗?
1.1 不允许左花括号另起一行
1.2 编译器莫名其妙地给行尾加上分号
1.3 极度强调编译速度,不惜放弃本应提供的功能
1.4 错误处理机制太原始
1.5 垃圾回收器(GC)不完善、有重大缺陷
1.6 禁止未使用变量和多余import
1.7 创建对象的方式太多令人纠结
1.8 对象没有构造函数和析构函数
1.9 defer语句的语义设定不甚合理
1.10 许多语言内置设施不支持用户定义的类型
1.11 没有泛型支持,常见数据类型接口丑陋
1.12 实现接口不需要明确声明
1.13 省掉小括号却省不掉花括号
1.14 编译生成的可执行文件尺寸非常大
1.15 不支持动态加载类库
1.16 其他
- 不支持方法和函数重载(overload)
- 导入pkg的import语句后边部分竟然是文本(import ”fmt”)
- 没有enum类型,全局性常量难以分类,iota把简单的事情复杂化
- 定义对象方法时,receiver类型应该选用指针还是非指针让人纠结
- 定义结构体和接口的语法稍繁,
interface XXX{}
struct YYY{}
不是更简洁吗?前面加上type
关键字显得罗嗦。 - 测试类库testing里面没有AssertEqual函数,标准库的单元测试代码中充斥着
if a != b { t.Fatal(...) }
。 - 语言太简单,以至于不得不放弃很多有用的特性,“保持语言简单”往往成为拒绝改进的理由。
- 标准库的实现总体来说不甚理想,其代码质量大概处于“基本可用”的程度,真正到企业级应用领域,往往就会暴露出诸多不足之处。
- 版本都发展到1.2了,goroutine调度器依旧默认仅使用一个系统线程。GOMAXPROCS的长期存在似乎暗示着官方从来没有足够的信心,让调度器正确安全地运行在多核环境中。这跟Go语言自身以并发为核心的定位有致命的矛盾。(直到2015年下半年1.5发布后才有改观)
- 官方发行版中包含了一个叫oracle的辅助程序,与Oracle数据库毫无关系,却完全无视两者之间的名称混淆。
第2节:我为什么对Go语言的某些人不爽?
如果一个项目、团队、社区,到处充斥着赞美、孤芳自赏、自我满足、不思进取,排斥不同意见,拒绝接纳新方案,我想不到它还有什么前进的动力。逆水行舟,是不进反退的。
第3节:还有比Go语言更好的选择吗?
第4节:写在最后
我不原意被别人代表,也不愿意代表别人。这篇文章写的是我,一个叫Liigo的80后屌丝程序员,自己的观点。你完全可以主观地认为它是主观的,也完全可以客观地以为它是客观的,无论如何,那是你的观点。
著名的编程语言研究专家王垠写了一篇《对 Go 语言的综合评价》(晚于本博文发表约三五天),也是总体上持批判态度,看衰Go语言。读者们可以对照阅读。
文中1.10(黑魔法)和1.12(接口)章节增加了两处“延伸阅读”链接,被引用的链接后面均有大量网友评论。此举主要是为了说明本文观点并非一家之言。
补充说明Go语言直到2015年下半年1.5发布后才将GOMAXPROCS设置为大于1的默认值(HN),他们文中承认之前一直默认设置为1是因为调度器不完善(与我此文最初发表时的猜测一致)。
文中1.5节(垃圾回收器/GC)增加 “Stop the world” 相关的三个链接。
文中1.11节(泛型)增加来自HN的延伸阅读链接,开发者们抱怨Go欠缺泛型支持。
文中1.5节(垃圾回收器/GC)末尾增加一段,再次提示开发者重视Go语言GC的潜在问题。
文中第2节(我为什么对Go社区的人不爽)增加netroby和D语言联合创始人的现身说法。补充说明Go 1.5后不再使用C语言开发。
转载于:https://www.cnblogs.com/junneyang/p/6117879.html
【GoLang】转载:我为什么放弃Go语言,哈哈相关推荐
- 驳2B文 我为什么放弃Go语言
此篇文章流传甚广, 其实里面没啥干货, 而且里面很多观点是有问题的. 这个文章在 golang-china 很早就讨论过了. 最近因为 Rust 1.0 和 1.1 的发布, 导致这个文章又出来毒害读 ...
- 驳狗屎文 我为什么放弃Go语言
驳狗屎文 "我为什么放弃Go语言" 此篇文章流传甚广, 其实里面没啥干货, 而且里面很多观点是有问题的. 这个文章在 golang-china 很早就讨论过了. 最近因为 Rust ...
- 视频教程-桫哥-GOlang基础-01基本程序设计-Go语言
桫哥-GOlang基础-01基本程序设计 多年互联网从业经验: 有丰富的的企业网站.手游.APP开发经验: 曾担任上海益盟软件技术股份有限公司项目经理及产品经理: 参与项目有益盟私募工厂.睿妙影音家庭 ...
- Golang cgo编程 [] string 转 C语言 char**
1 2 3 4 5 6 7 8 9 10 11 12 func Test(args[] string){ arg := make([](*_Ctype_char), 0) //C语言char* ...
- golang生成c-shared so供c语言或者golang调用到例子
1.golang生成c-shared类型到so 建立文件夹hello,创建main.go文件,内容如下 package mainimport "C"func main() {}// ...
- golang微服务框架对比_Go语言开发的微服务框架,你了解多少?
Go语言开发的微服务框架 1.项目名称:Istio 项目简介:Istio是由Google.IBM和Lyft开源的微服务管理.保护和监控框架.使用istio可以很简单的创建具有负载均衡.服务间认证.监控 ...
- golang byte转string_Golang和Rust语言常见功能/库
时下最流行.最具发展前途的的两门语言是Golang和Rust.Golang语言简洁.高效.并发.并且有个强大的囊括了常见功能标准库.与之相对比,Rust语言则主要是安全.高性能.虽然Rust没有gol ...
- 谷歌放弃C++语言,Python将要一统江湖了?
最近Google工程师表示,目前Chrime代码库存在的安全漏洞70%是内存管理的安全漏洞,其中50的内存漏洞是ues-after-free漏洞,因为这些漏洞给与了攻击者机会,然后就有人吐槽C++不行 ...
- golang杀死java_用Golang来保护Java程序-Go语言中文社区
#反编译带来的困扰 对于一个开发给自己组织内部用的程序,我们是不怎么需要考虑程序被反编译的事情的,但是对于商业软件来说,这又显得有必要,毕竟国内软件行业的竞争还是非常的激烈,大家可以把竞争对手的程序搞 ...
最新文章
- 【CentOS 7MySQL常用操作3】,MySQL常用命令#180113
- 云计算,能回答地球最终流浪到哪里吗?
- 鸿蒙系统的逻辑,鸿蒙系统逻辑近似苹果iOS13?这华为在搞什么?
- 林昊获中国计算机学会杰出工程师奖,阿里中间件再获高度肯定,“三位一体”推动技术普惠
- 安装Typora情况下,Windows右键新建菜单中增加新建md文件
- 三层体系结构学习总结
- php按照二维数组某个字段排序,PHP 二维数组根据某个字段排序
- MindSpore手写数字识别初体验,深度学习也没那么神秘嘛
- 好的 Web 前端年薪会有多少?
- 一定质量的封闭气体被压缩后_螺杆压缩机转子型线设计原则及发展过程
- Google C++测试框架系列高级篇:第一章 更多关于断言的知识
- 《华为问题管理法》读书笔记2
- ArcGIS分享: 地图分幅及编号
- luarocks - 介绍
- 科普类(二)先有鸡还是先有蛋?看看C语言怎么说......
- windows 7 iso镜像刻录到U盘后选择安装的版本
- R语言 时间序列arima模型
- 阿里云虚拟主机wordpress伪静态设置Nginx设置
- 华为云主机安全助力企业种出“金葫芦”
- Android 真正的3D Gallery
热门文章
- Java--FutureTask原理与使用(FutureTask可以被Thread执行,可以被线程池submit方法执行,并且可以监控线程与获取返回值)...
- http://wenku.baidu.com/view/63e7b8270066f5335a812142.html
- WebService大讲堂之Axis2(5):会话(Session)管理
- float与double的范围和精度
- leetcode算法题--Combinations
- leetcode算法题--反转字符串
- vue路由切换组件没有加载_vue-router 路由跳转后没有加载组件
- m3u8 video ios h5_【H5】iOS系统下的video视频播放完后重新刷新视频
- 鸿蒙2.0操作体验,鸿蒙2.0操作系统正式版-华为鸿蒙2.0操作系统正式版官方预约 v1.0.0-优盘手机站...
- linux查看nginx运行状态,如何查看nginx运行状态及相关属性说明