对《为什么说 2017 年你必须要学习 Go 了》这篇文章的疑惑

2017-01-14 13:48:11 +08:00
 gouchaoer

前几天被一篇文章《为什么说 2017 年你必须要学习 Go 了》刷屏了,我原本也学过一点这门很火的语言但是没有真正用过,于是点进去看了下觉得功利+不靠谱。码农闻到了 bad smile 就是不吐不快,今天来战一战 go 语言吧。

第一段大篇幅写“硬件限制”,讲对多核的利用+对 cpu 高效率利用多么重要,的确这个很重要,各语言肯定都在追求做好这件事。

第二段讲 goroutine ,我觉得 goroutine 是好东西但是和多线程比肯定不行啊, goroutine 本质上是把异步回调的代码用同步的方式来写(语言底层处理了细节,所以性能上和异步回调并没有差别),你要比和 libevent 之类的异步事件库比啊;而且你黑 python 多线程也就完了, java 的多线程那么好那么工业级的东西。实际上 goroutine 的确比异步回调写起来容易了,单身业务逻辑多线程同步方法写肯定是最简单的。那个( Beautiful,straight code/Efficient concurrency )表严重不同意,静态类型的 c/c++和 java 在可读性上会比 erlang 、 clojure 差么,会和 js 、 perl 、 python 这些脚本语言在一个层次上么?而且性能还要看场景的,你这么钦定了真的好么。

第三段 go 可以编译成二进制的确很震撼,不过既然没有消灭 gc ,那你说 go 的是一个 runtime 不是虚拟机我也无话可说。然后讲 go 的性能怎么不提 gc 了, rust 也是编译成二进制消灭 gc 消灭 malloc/free 的。

第四段讲 go 代码容易维护,举了一堆 go 没有的特性然后来把这个当 feature ,我觉得很搞笑。然后 Go 和其他语言非常不同这一点我承认,但是这也是我学习 go 的时候非常不适应的原因。我觉得一个语言最珍贵的品质应该是解决问题而不是与众不同的语法,在我这个 go 初学者眼里 go 除了编译成无依赖二进制和 goroutine 这 2 个杀手级 feature 以外,作为一个开发者我看不到它有别的创新,甚至有很多业界广泛使用的 feature 没有做。我学过语言也学了半打了吧,我很烦一些编程语言搞一些特立独行的语法,如果你这个语法没有带来新的 feature 那么老老实实学 c/c++或者 java 就完了嘛, go 语言看起来丑说到底还是语法想搞的特立独行。

然后我比较同意的是他把 Go 的兼容性拿来说了一下,这也是我非常看重的。另外代码维护就不得不提第三方库管理机制吧?

最后说 GO 的背后是 google ,这个潜意识不就是社区驱动的语言不如大公司驱动的语言么,我认为这是非常功利的说法。 mysql 背后就是大公司, postgresql 背后就社区,二者都做的很好,而 google 为啥还迁出 mysql ; java 背后还是 sun 是 oracle 呢,微软和 google 不是还被恨咬过么。实际上一项基础设施技术一个大公司主导好不好这个还是不好说,大公司投入肯定好,但是大公司为了自身业务有的情况会和社区有分歧,实际上 go 官方对社区的意见就没有社区驱动的 rust 重视嘛( rust 由 mozilla 公司驱动)。 Facebook 为了满足自身也无需要弄出了 hack 也没法强加到 php 身上,因为基础设施肯定要服务大多数开发者。

我个人就是个土包子喜欢实用皮实的技术,我讨厌装逼的技术 /工具 /库 /语言,对我来说啥是装逼的技术呢? 重复造轮子,把自己包装的逼格很高,忽视兼容性,性能差,和业界现有的工作缺乏继承关系,故意弄得不兼容。

25525 次点击
所在节点    程序员
116 条回复
linboki
2017-01-14 18:43:09 +08:00
@neoblackcap epoll + 线程池 + eventfd 可以封装出和 iocp 一样的接口,但内在区别就是一个在内核等 io 事件,一个在用户态等
zonyitoo
2017-01-14 18:48:57 +08:00
@zwh8800
> c/c++项目更别说了,安装依赖就够喝一壶的了。

其它的我先不评论。光说这个,你有部署过 C/C++项目么?你知道 C/C++项目也是 static link 然后一个 binary 直接 rsync 上去的么?
neoblackcap
2017-01-14 18:57:27 +08:00
@linboki 这就很大区别了,一个是内核可以感知,一个是内核不能感知。那么怎么调度?你用户态堵塞的时候,我内核到底要不要挂起该进程?
zwh8800
2017-01-14 18:59:38 +08:00
@zonyitoo 没部署过。但见过/听说过游戏公司 server 怎么搞,并不是所有的公司都是 static 的。有的 server 还部署在 windows 上,带一堆 dll
linboki
2017-01-14 19:13:15 +08:00
@neoblackcap 网络 io 用非阻塞 epoll 等&执行(开一条新线程,磁盘 io 直接放线程池调度,主线程无任何阻塞
gouchaoer
2017-01-14 19:13:58 +08:00
@monsoon 阿汁你发散思维真强
@majinjing3 我只是总结了一下,除了 go 以外很多技术 /工具 /库 /语言有这个些毛病中的几点,至于 go 的问题我前面也说了。

@hjc4869 垠神已经疯了,你看他质疑 911 的那篇
scnace
2017-01-14 19:21:54 +08:00
什么? Golang 也要加入圣战了?所以 为什么要安利别人学 Go 自己觉得好用就行了啊…… 强行安利感觉会污染 Gopher 圈子 开 Goroutine 也需要谨慎啊 线程间切换也是有代价的…… 说白了 Goroutine 并不是严格意义上的多线程 但是还是很好用就是了…
```golang
if err!=nil{
return err
}
```
这次怎么没人说 golang 的错误处理了(逃
spice630
2017-01-14 19:23:51 +08:00
@cuebyte
请 block 我
cyr1l
2017-01-14 19:39:29 +08:00
觉得 swift 跟 go 挺像的,但是 swift 的老大都去特斯拉做自动导航了。
alexsunxl
2017-01-14 19:58:34 +08:00
@cyr1l 搞 compiler 么有搞 ai 好玩么 23333
JamesRuan
2017-01-14 20:08:09 +08:00
怎么没有人提 CSP ?
没 CSP 的 channel 去写 goroutine 和写 C++差别也没有特别大。系统级别同步原语都能用,就看有没有必要去使用了。

怎么没人提工具链?语言诞生之初就具备如此丰富的工具链还是非常少见的。举个例子: debug 时可以通过 HTML 暴露程序内部状态,比如说一共有多少个 goroutine 在跑,他们各自的调用栈和当前的状态。这类调试方式也就在 Erlang 这样的语言见过。其他语言你开一堆多线程,还要手动去维护他们的状态,调试起来就够你喝一壶了。
liujiangbei
2017-01-14 20:18:26 +08:00
楼主又来引口水。。。
hjc4869
2017-01-14 21:05:30 +08:00
@gouchaoer 写这篇文章的时候他的文章还挺正常的
mengzhuo
2017-01-14 21:30:00 +08:00
@scnace 这个错误处理很工程啊
就算是 python 的生产级代码也是要处理多种错误的
firefox12
2017-01-14 22:03:38 +08:00
我用 go 和 c++ 都可以写单机百万的程序,但是 go 要简洁很多,起 100 万个 goroutine 也没有问题。 go 的问题是 缺少完整的生态链。但是我觉得在后端会很多有机会。
chenqh
2017-01-14 22:09:30 +08:00
@sagaxu 只是语法可以 async,await 了而言,第三方库呢
sagaxu
2017-01-14 22:12:49 +08:00
@chenqh 因为 js 天生异步,很多库都返回的 promise ,前面加个 async 就支持了,工作量小很多
chenqh
2017-01-14 22:19:52 +08:00
@sagaxu 然而老子是菜鸟呀,看 promise 看得脑子晕得要死,更不要说好多库都不支持 promise 了
loqixh
2017-01-14 22:35:10 +08:00
c# 的 async,await 也是 N:M, 还可以自定义成 1:1
sagaxu
2017-01-14 22:42:26 +08:00
我倒是更看好 JVM 上的 kotlin ,它是个不啰嗦版 Java 。跟 Java 无缝集成,充分利用现有的 Java 库是很大的优势。它的 coroutine 也即将出炉,而且官方也支持编译输出成 JavaScript ,可玩性很强。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/334561

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX