Re: [请益] 为什么 Go 会红?

楼主: LinuxKernel (Linus Torvalds)   2018-04-03 23:06:52
不敢说会写,只能说略懂,以下简单分享。
先说觉得好的地方
1. 对 non-blocking 的封装
大家都知道在 C/C++ 底下要写出高并发性能的 server 很多细节是很麻烦的
你可能说写 server 不就开个 socket 搭配 fork 多么直观
但现实是要达到好的性能就需要 select、epoll、kqueue 甚至 thread pool 之类的东西
但 non-blocking 的世界毕竟不是那么直观
Go 强的地方就在于他让你用很直观的 blocking 写法
一个 client 进来你也就像 fork 一样给他开个 goroutine
但实际上它底层 runtime 就是用 epoll/kqueue 帮你做掉
也帮你做这些 lightweight thread 的 scheduling
当然 C/C++ 的世界也有类似的 library 可以办到,像是 Boost.Fiber
但 Go 里面用 goroutine 搭配 channel 感觉就是优雅了些
不过 goroutine 还是有可能踩到坑的
例如 goroutine 就永远卡在那边,这点可以去了解一下它 scheduling 的实作
2. 简单易写、静态语言
Go 的语法相当简单,keyword 也非常少
等于说让你用简单易写的方式有机会写出接近 C 效能的应用程式
另外它还是个静态语言,程式写久了虽然动态语言写起来爽
但到头来私心还是觉得静态语言更适合做大事 (战)
3. 跨平台、易部署
有稍微写过应该就知道,直接编成一个 binary 档部署真的非常方便
cross-compile 也不是难事
说到觉得不好的地方反而好像可以列出更多
1. 缺少 generic 支援
这点有时候真的很麻烦,顶多只能拿 interface{} 凑合著用
印象中还看过有人还另外开发了一个 generic code generator
例如:https://github.com/cheekybits/genny
不过官方对于 generic 这个议题一直是 open for discussion 状态
我相信 Go 2 是有机会出现的
讨论串:https://github.com/golang/go/issues/15292
2. exception 处理
在 Go 的世界基本上 exception 都是透过 return value 在传递的
所以也经常可以看到这种嘲讽的图片
https://i.imgur.com/EL0gEUD.jpg
有写过的人看到这图片一定很有感,程式里四处都是 if err != nil
实在是每个 Go 开发者都应该有的按键!
3. 套件管理
这点在加入 vendor 资料夹的支援后稍微好了一些
也开始出现了一些第三方基于这个设计的 package management tool(例如 Glide)
官方在这部分其实也开始有了动作,未来应该会由 dep 一统天下
dep: https://github.com/golang/dep
而关于套件另一个恼人的问题则是 import path
import "github.com/user/repo/..."
今天如果 upstream 改了 path 就准备炸裂
而且这也让 open source contribution 麻烦了许多(当你 fork 时)
相关抱怨文:https://bit.ly/2uNrXnA
4. 龟毛
Go 有个我觉得很讨厌的坚持
就是如果程式里有宣告了却没有使用到的变量会直接 compile error
动机是想增进 code quality 是好的没错
但有时你如果只是为了 debug 这点实在很烦人......
我觉得整体来说还是 Z>B
只是到底换了 Go 是不是能让你有 gain,这点还是要好好评估的
或许你根本也不知道你的 bottleneck 在哪,只是觉得潮~
作者: robler (章鱼丸)   2018-04-03 23:12:00
go以后应该还是会加进那些常用的功能但是他的优点其它的语言也是学的很快
作者: hl4 (Zec)   2018-04-03 23:14:00
我以为goroutine是用coroutine的方式实作的
作者: PUTOUCHANG (自己的废文自己发)   2018-04-03 23:41:00
Mazin Go~
作者: foodordertw (foororderTW)   2018-04-04 00:04:00
应该说同步和异步写法比较精确
作者: hung0724 (三头)   2018-04-04 00:04:00
真的满满都是 if err != nil
作者: y3k (激流を制するは静水)   2018-04-04 04:32:00
那个按钮应该有Plugin支援了吧XD
作者: Darkautism (达卡特森)   2018-04-04 11:09:00
你的id和你的内文很冲突。linus明明在公开信中都谈到这些c++特性是无关紧要的,你却反而认为是缺点?写linux kernel也是一层层return值回乎,这点go一样的你如果没有办法坚持本人的观点就不要挂名,做事做一半
作者: PUTOUCHANG (自己的废文自己发)   2018-04-04 18:46:00
杀小连唉滴都可以战
作者: wendly777 (小水)   2018-04-05 17:32:00
没有generic是我最讨厌的地方,再来是没有overloading

Links booklink

Contact Us: admin [ a t ] ucptt.com