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

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

25747 次点击
所在节点    程序员
116 条回复
neoblackcap
2017-01-15 01:28:04 +08:00
@linboki 所以说嘛,在使用用户态线程时就是得注意磁盘 IO ,要不然一次调度直接上万个用户态线程挂起。自己写的代码尚可这样,若是不是自己写的代码就得重写所有底层磁盘 IO 相关函数,否则一样大暴死,因为你不知道哪个库会在库里面来一下磁盘 IO 操作。
nocturnal
2017-01-15 01:42:13 +08:00
第二理解的相当有问题,协程不是异步回调,协程是状态的保存和切换,这种思想很容易写出异步代码,实现同样的异步功能, c++或者 java 之类的写到你想吐~
Orzzzz
2017-01-15 01:54:45 +08:00
@weiweiwitch docker 算啥类型的项目 :P
jarlyyn
2017-01-15 02:57:36 +08:00
最近看某热贴,瞎琢磨了下 go 语言。

怎么感觉你们讨论的和我理解 go 语言不是一个东西……

我理解里, go 语言不就是 shell 脚本的 plus 版 python 的高效易部署的 plus 版么……

分明是被 python 的 2.x 和 3.x 搞了这么久搞了烦了,我直接打一个包爱几点几就几点几。

你限制缩进这个能打出脑浆的东西,我连花括号换行不换行这个宗教问题都给你限制了。

怎么会和 php 以及 node.js 打起来的。

一定是我理解能力的问题。
missdeer
2017-01-15 09:23:28 +08:00
@cuebyte 为什么每个公司甚至大公司里的每个项目组都会有一份自己的 coding style guideline ?这就说明 gofmt 存在的意义。有的人只顾自己心情想咋样咋样,说好听点是职业化程度不高,说难听点是自私自利,不顾全大局。多人合作开发的项目统一的编码风格能省掉多少麻烦,那不是让每个人自由发挥自己喜恶,彰显个性的地方。说你对软件工程一无所知已经是很留面子了。
missdeer
2017-01-15 09:34:27 +08:00
@weiweiwitch 同意你说的,我原本的意思是 go 的一些设计解决了一些用其他语言做大型项目时遇到的痛点,但 go 目前说来做大型项目还是有点吃力,代码比较难组织,感觉这是所有脚本语言也常存在的问题。
phrack
2017-01-15 10:02:04 +08:00
无所谓,我主要就用 py 之类的脚本语言,大家伙用 go 的写好我直接调用就好了。
MayLava
2017-01-15 10:46:01 +08:00
第一句话就已经看不下去了。

“摩尔定律正在失效 第一个具有 3.0GHz 时钟速度的 Pentium 4 处理器是由英特尔于 2004 年推出的。 而今天,我的 Mackbook Pro 2016 的 CPU 时钟速度为 2.9GHz 。 可以看到在过去的十年中, CPU 处理能力没有太大的进步。 您可以在下面的图表中看到这一点。”

不知道这图表谁做的。横轴年份等差,纵轴年份等比。我只看到了 CPU 性能依旧爆炸式的上升中。
摩尔定律失效是没错,但是这并不代表性能就没有进步了。
zongwan
2017-01-15 12:37:12 +08:00
go bigger or go home

众所周知, swarm 是用 golang 打造的, k8s 也是用 golang 打造的
两者因为某些利益在竞争
战争背后散户也是有钱赚的

会写个 Android 可能 google 并不会要,因为 google 的战略是开市场,所以自身也开发 APP 会互相竞争
因为 google 也参与竞争, golang 学好了说不定就会有站 google 队伍的机会了

golang 现在好不好用并不重要,诞生的原因注定了以后 google 之后的仗用的到
---
当年的 dart , ng js 没有选择它, 因为 TypeScript 满足不了自己,所以准备开发 ngScript
后来 TypeScript 选择站队
不过再后来 dart 还是准备抱 ng js 大腿
ng js 现在好不好也并不重要了
但请记得 V8 好久没出来站队了

PS: 我周围没什么 golang 的圈子所以没学起来
等 golang 圈子扩大的阳光普照到吃瓜群众了,再开始学习也应该来得及吧。。。
justmile
2017-01-15 13:12:25 +08:00
本人菜鸟级 C 语言爱好者,不得不说用 GO 写并发确实省心, C 写起来真是一大坨,各种操碎了心!
说说本人对 IO 多路复用和 goroutine 的理解:
有家餐馆,只有一个伙计,客人来了先让客人入座,客人该干嘛干嘛,伙计每次忙完手上的事情的时候都会检查还有谁需要服务,如果是这边要倒茶,那边要上菜,没事,我们一个个来,反正大家有需求的时候都能得到比较好的服务。
另一家餐馆,也同样只有一个伙计,客人来了也是先入座,但伙计会跟客人说:您看这么多人,我服务您的时间是有限的。比如客人坐下要点菜呀,点了一个菜另外一桌也要点菜了,伙计就说,不好意思啊,您先歇歇,我给另外一桌也点个菜,完了再过来为您服务
上面第一个伙计就是 IO 多路复用,第二个就是 goroutine ,按我自己的理解, IO 多路复用的效率还是要高一些的,但 goroutine 有个优点就是可以很好地防止当前操作阻塞线程
各有优点,何必要强说哪一个强哪一个弱呢?
fourstring
2017-01-15 13:36:41 +08:00
我看了一下这篇文章,作者开头竟然仅仅用主频没有大变化证明摩尔定律失效,论证堪忧啊
mengzhuo
2017-01-15 14:01:02 +08:00
范型…… go 自带的 interface+ auto generate 还不能满足你们的要求么?
cuebyte
2017-01-15 14:13:11 +08:00
@missdeer 本来还想为什么你能一本正经大放厥词,捧 gofmt 臭脚,还说不懂 gofmt 的人就不懂软件工程。没想到你拿 go 和脚本语言做比较了,可能是个高端黑,在下佩服。
Weixk
2017-01-15 14:54:26 +08:00
说句实在话, Go 语言在 2016 年已经相当流行了。在我实习公司(国内软件产值最大)很多的部门使用编程语言都是 go + java 了。
missdeer
2017-01-15 15:09:05 +08:00
@cuebyte 麻烦我没说过的话不要套到我的头上,往上翻翻我什么时候说了“不懂 gofmt 的人就不懂软件工程”,往大了说是栽赃诬陷。被有这样用心的人说一句“佩服”,我真心惶恐。
zzn
2017-01-15 15:43:15 +08:00
大体看了一下文章,作者基本没说啥呀,这种文章也能火起来?
很多问题其实看这里好一点: https://golang.org/doc/faq

goroutine 是协程,协程当然也是利用多线程+worker 队列来实现的,只是还处理了很多别的,比如系统调用不阻塞运行 goroutine 的物理线程等,协程比起单纯的多线程还是高级一点的,当然要是物理线程足够轻量那就没有用户态协程什么事了。

说是 runtime 而不是虚拟机应该是因为 go 编译出来的是 native code ,不需要二次转换。

gc 和性能也没啥大关系,写代码喜欢随意分配内存的人,即使没有 gc 也会有问题,而 gc 带来的好处尽量少的内存管理,而不是完全不管内存,写 gc 友好型代码也是一项很好的技能。任何特性都是有代价的, gc 带来的坏处是容易让人写出 gc 不友好代码,让很多程序员的锅就成了 gc 的锅。

golang 其实有很多问题的,比如最让人蛋疼的是 string []byte 的转换是会拷贝的,编译器目前还没有能力分辨出是否需要拷贝。但作为一门新语言来说,其实还是很不错的,简洁的语法,够用的特性,默认静态编译,好用的 goroutine ,完善的库,开箱即用的测试/调试工具等。
Balthild
2017-01-15 19:35:03 +08:00
@MayLava 这真不是在黑牙膏厂吗哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
HarveyDent
2017-01-15 19:46:28 +08:00
不太清楚 erlang 和 go 的区别,有达人来科普一下吗? go 和这个 20 多年前的东西本质区别在哪里。
SoloCompany
2017-01-15 20:11:57 +08:00
[在 Java 中创建新线程会消耗大约 1MB 的内存堆大小]
如果这文章不是翻译的差错百出,这么垃圾的文章喷也是浪费那个功夫
jyf007
2017-01-15 20:26:51 +08:00
@ericbize 同上,一个只会写依赖 awk sed coreutils bash ,拼接 sql 的门外汉该怎么学习???

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

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

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

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

© 2021 V2EX