对《为什么说 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 身上,因为基础设施肯定要服务大多数开发者。

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

25844 次点击
所在节点    程序员
116 条回复
sagaxu
2017-01-14 16:09:32 +08:00
@gouchaoer swoole 的 coroutine 写起来比 go 还麻烦,且只能调用 swoole 封装好的东西,一旦调用到其它阻塞型 php 库,立刻失去 coroutine 的能力。所有的半路支持 coroutine 的语言,都有兼容现有库的问题, node 和 go 这样的,没有历史包袱,但是换句话说,库也没有那么丰富。
spice630
2017-01-14 16:09:41 +08:00
你大概不喜欢 C
gouchaoer
2017-01-14 16:13:48 +08:00
@sagaxu node 哪里天生支持协程了,都回调地狱吧
jmp2x
2017-01-14 16:16:22 +08:00
@zwh8800 说的蛮好的, 第一点可以解决 py 不能打满多核. 对于这种协程实现原理大致相同, 就是模拟线程切换, 只不过对于 tornado 这类是需要用户去判断什么时候切换, gevent 只是对 所有的 socket io 进行了 patch, 对于 go 而言, 也就是 @gouchaoer 的疑问, golang 对内部所有可能的阻塞系统调用都做了封装, 当遇到可能发生阻塞的系统调用自动切换, 关于这方面可以浏览相关 goroutine 切换原理.

对于 @zwh8800 说的第二点有一点小感触就是, 利用 docker 实现跨平台编译, Mac 上开发好后直接用 docker 进行编译, 然后扔到服务器就好.
spice630
2017-01-14 16:18:08 +08:00
那篇文章没什么毛病,只是标题有点武断,是楼主自己不小心中了圈套~~~
sagaxu
2017-01-14 16:20:19 +08:00
@gouchaoer node 虽然没有 coroutine ,但是天生无阻塞啊。而且 js 引入了 async 和 await ,层层回调的写法,马上就要成为过去式了。
monsoon
2017-01-14 16:48:21 +08:00
楼主无视这种文章好了,其实这只是一种营销性吸引开发者学 Golang 的文章,看了下文章还有讲没有范型代码容易维护的……

刚刚我写了好几篇推广的软文!

为什么说 2017 年你必须要学习 C 了
C 语言,用的这么广的工业级语言你都不会,世界上牛逼的操作系统之一就是 C 语言学的, fuck nvidia , 2017 年你必须要学习了!

为什么说 2017 年你必须要学习 Java 了
Google 都在用 Java ,世界上市场份额最大的手机系统就是用 Java 写程序的, Minecraft 都是用 Java 写的,你竟然还不会还在这里悠哉地看这些文章, 2017 年你必须要学习了!

为什么说 2017 年你必须要学习 JS 了
在浏览器上吊打其他语言的语言你都不会, 2017 年你必须要学习了!

为什么说 2017 年你必须要学习 Typescript 了
JS 的超集,由微软这么牛逼的公司推广、 Anders Hejlsberg 怎么牛逼的开发者开发的语言, 2017 年你必须要学习了!

为什么说 2017 年你必须要学习 Haskell 了
最牛逼的 fp 的语言之一你都不会,你连 fp 都不懂,怎么装逼, 2017 年你必须要学习了!

为什么说 2017 年你必须要学习 Rust 了
hack 看了会顿悟,系统级编程爱好者看了会流泪,这么牛逼的语言…………
monsoon
2017-01-14 16:55:43 +08:00
上面打错字了( sorry
范型 -》 泛型
WittBulter
2017-01-14 17:00:07 +08:00
@monsoon hack 看了会顿悟,系统级编程爱好者看了会流泪。。。 笑出声
gamexg
2017-01-14 17:02:28 +08:00
@gouchaoer 文件操作至少 windows 是直接使用的系统阻塞调用,但是 go 运行时会自动再启动一个系统线程来提供给其他 go 协程,所以可以当作是。
gamexg
2017-01-14 17:05:15 +08:00
@neoblackcap 开几 w 系统线程操作系统受不了啊。。。
majinjing3
2017-01-14 17:06:45 +08:00
楼主说自己土包子,还真说对了,最后一段话,赤裸裸的打脸的感觉, go 哪装逼了?哪忽视兼容性了?性能差?缺乏继承关系?故意不兼容?
ruooooooli
2017-01-14 17:08:34 +08:00
我是个 golang 的新手 大概用了一段时间 我感觉挺好的 哈哈哈 还没到各位大神的境界
youngsterxyf
2017-01-14 17:11:47 +08:00
@youngsterxyf 纠正一下,是楼主对 2 、 3 点理解错了。
cuebyte
2017-01-14 17:13:07 +08:00
go 语言本身没大问题,就烦那些 go 吹。
wangxn
2017-01-14 17:21:44 +08:00
bad smile -> bad smell
Vanessa
2017-01-14 17:23:35 +08:00
欢迎各位大神前来学习,可在线编辑运行学习 golang 哦 https://hacpai.com/article/1437497122181
neoblackcap
2017-01-14 17:29:17 +08:00
@gamexg 据我了解,主流的操作系统也就只有 windows 可以读写文件达到也达到异步, IO 操作请使用 windows 特有的 IOCP
zwh8800
2017-01-14 18:01:53 +08:00
@gouchaoer : golang 里想要调用阻塞的系统调用也是有方法的,直接调用 syscall 包里的函数或者用 Cgo 包一层。

@neoblackcap :关键是新手玩家玩线程会很要命,我见过有的安卓项目最多开了上千个线程的(每下载一个图片开一个),这样系统肯定吃不消。

老手的话, M : N 和 1:1 都能玩转了。

我个人感觉自己水平不到家,还是玩 golang 吧😄
hjc4869
2017-01-14 18:34:39 +08:00

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

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

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

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

© 2021 V2EX