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

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

25466 次点击
所在节点    程序员
116 条回复
k9982874
2017-01-14 13:53:59 +08:00
只有 google 不把 android 都开发语言换成 go , go 到 2027 年也主流不了
SuperFashi
2017-01-14 14:14:37 +08:00
最后一段的前 9 个字是我的回复。
undeflife
2017-01-14 14:21:09 +08:00
"我对 go 没什么意见,但是一些 go 吹挺惹人厌的."
echo1937
2017-01-14 14:55:36 +08:00
个人比较感兴趣的是:编译成无依赖二进制和 goroutine ;烦的是有些无脑吹。

未来混合语言编程是主流…
aksoft
2017-01-14 15:05:07 +08:00
装逼让雷劈
gamexg
2017-01-14 15:08:16 +08:00
网关类服务,单机几 w 同时在线,日请求几千万。
程序基本没做优化,轻松就达到了预期目的。
至少我知道的语言都需要写成回调模式才能达到要求。( python 有一个库也能达到)

缺陷是至今 windows 还不原生支持编译成动态库,怎么和现有系统集成?
图形界面看官方是不打算提供支持了。
另外语言上还缺失泛型。
youngsterxyf
2017-01-14 15:08:58 +08:00
第 1 、 2 点楼主理解错误。
zwh8800
2017-01-14 15:12:27 +08:00
你对 goroutine 的理解错了。

goroutine 并不是 “把异步回调的代码用同步的方式来写”。而是在用户空间实现了一个 M 对 N 的调度器。

简单来讲,异步回调一般只开一个线程,有任务了之后会把让这个线程去执行这个任务,无法利用多核。

而 goroutine 会根据机器的运行情况开 N 个操作系统级别的线程,然后把 M 个用户级别的 goroutine 调度到这 N 个线程上。

golang 团队一直引以为傲的就是这个 M 对 N 的调度器,这种 M 对 N 调度器在业界也算是比较先进的。
linboki
2017-01-14 15:13:21 +08:00
喷还是赞?谁出来带带风向,我怕站错队
zwh8800
2017-01-14 15:17:44 +08:00
@echo1937 “编译成无依赖二进制”确实是一个很大的优点,大大减轻了部署负担。我见过有的 java 项目光部署脚本就写了好几百行。 c/c++项目更别说了,安装依赖就够喝一壶的了。就算是 python , php 这种脚本,部署时安装各种扩展也得考虑不同版本系统有没有对应版本的软件包。

golang 做部署的话基本上就是简单的复制粘贴操作。
liuzhen
2017-01-14 15:19:11 +08:00
直接喷还是走程序?
sagaxu
2017-01-14 15:21:40 +08:00
几天就能上手的东西,合适的地方就拿来用了,不需要那么多突出的理由的。最近我还顺手学了 kotlin ,把一些新的功能用这个实现了,感觉比 Java 少写了不少代码,写起来也更加的舒服了。如果有需要,一个项目用十种不同语言做 各自适合的事情,也未尝不可。
mazyi
2017-01-14 15:22:51 +08:00
文字是文字,技术是技术

文字的观点可能不对,毕竟圈子大了就混杂了,特别是这种标题党,自动屏蔽。

可是 go 语言确实发展比较不错,后面怎么样,看 google 爸爸的了。
backing
2017-01-14 15:24:37 +08:00
lz 太激动啦,想要喷的令人幸福,需要冷静一点
neoblackcap
2017-01-14 15:26:47 +08:00
@zwh8800 其实就是用户态线程, erlang 也有。记得 FreeBSD 也有过 M : N 的线程模型,后来发现 bug 多于是就砍了换成 1 : 1 。
M : N 初看是挺好,但是真的会比 1:1 模型强吗?我是表示怀疑的,在复杂的负载下,我认为系统的调度很有可能比用户自己调度好。
mengskysama
2017-01-14 15:37:34 +08:00
goroutine 是个很神奇的东西,他的调度能在行级,不是简单的 yield 一下就做到的。这种特性可以保证某个线程不会被拿不到资源被饿死。我也不相信 java 用线程模型造出来的东西性能可以好到哪里。

go 用下来最让人不满意的一点倒是官方的包管理工具,被 npm 甩几条街。
qwer1234asdf
2017-01-14 15:38:42 +08:00
一拨人出来开个讲座或者沙龙,然后,各个论坛就开始热议 xxx 语言要火了, xx 语言要取代 xxx 语言了。。。过一段时间又沉寂下去了。。。然后,过了一段时间又有类似的活动了,于是这波热议又开始了。。。
不过,语言还是那些语言。。。程序员还是那些程序员。。搬砖还是继续。。。
gouchaoer
2017-01-14 15:52:57 +08:00
@zwh8800 我问个问题, go 的所有 io 操作(包括数据库查询, socket ,文件等)是不是没有阻塞的说法,一旦进入等待马上让出 cpu 给别的协程,等 io 的数据返回了协程调度又恢复执行了呢?
oyjc
2017-01-14 15:57:14 +08:00
初时看上 go ,是因为 COPY 部署很方便。
特别是分发程序给其他人用(不用管他用什么系统),
很爽,直接拷着走,跟 DOS 年代似的,拷个 EXE 就能到处跑了。

后来用着用着感觉不是很爽,
1,语法虽简单,但感觉说不上的不舒服;
2,没用的变量也不能存在,不方便反复修改调试;
3,其它。。。

正好看到 .Net Core 开源,然后拥抱 C#,
现在可以 XCOPY 部署 EXE 文件夹,未来计划可以生成 Native 单一 EXE 文件。

什么异步回调/多线程啥的,挺舒服。

如果追求简单原则的话,预计 2017 年, WebAssembly 初步可用,届时, JavaScript 我也不想要了,
直接 C# 搞定前后端。
gouchaoer
2017-01-14 16:03:59 +08:00
@zwh8800 我这么理解 go 行么, N 个服务器 cpu 调度 M 个协程同时能运行的只有 N 个协程,而且 go 的所有 io 函数都没有阻塞,协程之间切换消耗可以很低,也就是说 N 个 cpu 在任何时候都在处理业务或者协程切换;如果别的语言比如 nodejs 的异步写法要达到 go 的效率必须满足 2 个条件,第一是开 N 个 nodejs 进程来利用所有 cpu ,第二是 nodejs 的所有 io 操作必须是回调写法(当然了回调写很复杂),而且现在有的语言开始尝试把 io 操作改造成协程的方式比如 php 的 swoole 。

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

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

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

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

© 2021 V2EX