粗大事了:花两天时间学习了 Go 语言,发现比 Node.js 高不知多少去了

2016-04-03 16:19:20 +08:00
 xhowhy

先说感受到的先进性:

  1. 语法非常简洁,有种在学 C 语言的感觉,学习过程觉得很轻松,没有太陡峭的曲线,但语言也完全够用
  2. 自带工具就非常强大,而且各 IDE 和 Editor 都能集成,开发工具完全不是问题
    • go get = git clone + go install ,从 github 上直接 clone 下源码,编译出 .a 包文件和安装 bin 到 $GOPATH ,就可以本地任意地方使用了。反观 npm ,相信很多人不知道 NODE_PATH 的存在。
    • gofmt 代码风格统一,码农们再也不用为空格与 Tab 争吵了
    • go test 支持 benchmarks 和覆盖率测试
    • godoc 查看文档的工具。支持本地执行 godoc -http=:8080 后就能在浏览器中访问 golang.org 的本地 copy 版,对被墙的同学是个不错的选择
  3. 支持 Github ( Gitlab 等也可以)远程包,不需要发布到类似 npm 那样的地方
  4. 并发用协程和 channel 非常容易写,业务逻辑中可以尽量避免回调
  5. 部署非常简单,可以运行二进制文件,也可以通过 go get 来安装 bin ,运维起来非常方便
  6. API 稳定,据说从发布到现在语法基本没变,只是 Go 内部做了改进和优化
  7. 本人还用 Swift 写过 iOS ,发现 Swift 似乎是从 Go 身上学了不少东西。。

劣势:

  1. G...FF..WWW ,想下个 pkg 安装文件非常困难,最后是通过 brew 下载的
  2. 国内资料少(这么简单的语言,似乎也不需要什么资料)
  3. 社区小不如 npm ,国内想找个工作更是困难

不确定性:

  1. 性能与 Java 比如何,相当于什么水平

综上所述,感觉 Go 确实是一个目前比较理想的开发工具,大家一起讨论讨论,人生苦短,为何不用 go ?

55015 次点击
所在节点    Node.js
197 条回复
cuebyte
2016-04-04 07:11:11 +08:00
夭寿啦,学了两天的 Go 粉来 V 站炸鱼啦!

请完整写过 1000 行以上的项目再来夸吧, Go 也就算个新时代的 C ,以及 goroutine 不错,其他方面也许还不如 Java 、 C#
nicevar
2016-04-04 08:39:28 +08:00
观战
王大神把 go 批判的一无是处
shyling
2016-04-04 08:57:33 +08:00
😏给你说几点:
defer,panic 什么鬼。
莫名其妙实现了接口什么鬼,明明静态类型弄的像 duck type 。
n:=struct{}是什么东西。。为什么有的要&struct{}。
map[string]string 是什么?为什么我自己用不了这个语法。
我靠经验尝试用"string".Replace ,呃,好吧,还要用 string.Replace 这个库函数。。不 oo 那就算咯。

😏那么,有什么理由让我们使用 super c 呢?对了, channel 的实现不需要锁?
zbing3
2016-04-04 09:07:40 +08:00
go 有反射就够了……
jzfr
2016-04-04 09:24:22 +08:00
嗯,火药味越来越重,撕逼已到高潮,是不是准备开打了?!
GentleSadness
2016-04-04 09:34:34 +08:00
@demomaster (*(void)(*)( ) )0)( ),(void)(*)()无返回类型的指向函数的指针 1 ?(*(void)(*)( ) ) *是指向前面那块东西的指针 2 ? (*(void)(*)( ) )0) 默认值是 0 ? 最后那个 () 函数调用?
demomaster
2016-04-04 09:40:12 +08:00
@GentleSadness 计算机启动时,硬件调用首地址为 0 位置的子例程.
demomaster
2016-04-04 09:41:01 +08:00
kslr
2016-04-04 09:50:48 +08:00
一些人真是太狭隘了,语言还不是拿来用的
anonymityl
2016-04-04 10:19:16 +08:00
私以为楼主如果真想讨论,何必取个这样的标题。
zhuangzhuang1988
2016-04-04 10:19:46 +08:00
你们吵架好厉害,我还是静静的学 F#/C#/Typesciprt
xiaoyu9527
2016-04-04 10:30:09 +08:00
我学 ASP 的时候 你们说 PHP 不知道牛逼到哪里去了
我学 PHP 的时候 你们说 PYTHON 不知道牛逼到哪里去了
我学 PYTHON 的时候 你们说 NODE.JS 不知道牛逼到哪里去了
我学 NODEJS 的时候 你们又说 GO 不知道牛逼到哪里去了
nareix
2016-04-04 10:36:01 +08:00
不出意料 lz 被喷了,战斗很激烈啊,过来支援下 lz

大于 5k 行代码动态语言在生产环境下用都是很坑的。不要拿那些已经用了的项目来说事儿,都是历史问题,一开始能用静态就用静态,用那些傻 x 的不会让人犯错的语言( go/java/c#)。
js 之所以流行也是历史问题,前端只能用它( webassembly 快来拯救世界吧)

nodejs 这种看似炫酷但实际坑多的东西就是要吐槽下才好,话说你们真的用它搞过大项目吗,搞过的摸着良心问问自己它坑是不是多, Promise 写起来烦不烦, await 忘记打了返回的结果就完全变了有没有,重构的时候痛苦不痛苦,一不小心就拼错,是不是特别依赖单元测试和回归测试。多人一起搞总有人很容易搞错,那些看着傻 x 的语言的最大优点体现在团队合作上,首先不犯错就是牛逼,其他的事情可以先靠边放。 G 家大量使用 java ,甚至用 java 来生成 js 代码, fb 家的 php 已经是带类型的了。

如果觉得 callback 很牛逼,写多几行你就知道咋回事儿了, callback 只是最原始暴力的机制,再写多几行就会发现 go 的那套的好处以及它考虑的深远程度,是加强版的 promise 和 async/await 。 nodejs 性能倒是还行,主要是由于 libuv 和 v8 ,跟它本身没啥关系。然而单线程模型还是被 goroutine 完爆,就算单线程性能比得上 go 也没用。部署的时候 npm 装一坨就不说了, go 完爆。

没大项目经历的人很容易被坑,一开始搭完一个 prototype 很兴奋,最后干了半天你发现,动态语言压根没有给你节省时间精力,前面节省的时间都被后面坑回来了,再次更换技术选型已经来不及只能继续被坑,换 ts 或者 flowtype 可以缓解,同理 python/lua 基本都是一个情况。
realsteve
2016-04-04 10:39:33 +08:00
求楼主这个 css
hooluupog
2016-04-04 10:40:29 +08:00
@shyling
defer 有什么不好的吗?具体说说。它类似 RAII 但有所不同。有人用 defer 模拟过延迟计算的特性,实现过一个定时器,这东西有可取之处。
panic 的使用原则就是“不 panic 就尽量不要使用 panic ,但它是个 panic 的时候,要尽早 panic ”。 erlang 里面也有类似的箴言,“尽早的出错”,等拖到后面一个都捕获不到,服务器挂了后抓瞎,不知道原因在哪里。
n:=struct{}就是一个初始化声明,有了&struct{},基本上就用不到“ new ”这个关键字了, n 以后说不定会删掉 new 。 java 里面一堆的 new ,很恶心的,现在新设计的很多语言都是没有 new 的。如果你搞 reactive 风格的编程, new 的恶心程度堪比 call back hell ;
map[string]string 就是 map<string,string>,前者是扁平形的,后者是嵌套的,你多嵌套几层,从可读性上你会发现前面的写法还是有可取之处的。另外就是省了个尖括号, Go 是能省就省。比如很多语言的 list 使用"[", "]"来表示,而 Go 里面 struct , map , slice 统统用"{ " , "}"。
"string".Replace ?那你是不是还想要 Int.xxx ,这典型的一切皆 OO 风格。 Go 当初定位是系统编程语言,它不如 c/c++那么底层,但又比 java 底层一些,比 python/ruby/js/php 这些动态语言来说,代码书写的自由度上肯定不能比,但天下没有免费的午餐。 Go 一切是按值传递而非引用(slice 实际上不能说是引用类型, Go 里面没有引用的说法。传递的是指针的值)。那么为何要保留指针?为何不那么 OO ?其实都是一种折衷的选择。因为它当初的定位是系统编程,性能和开销需要有个限度。例子: java 9 或者 10 要实现的 value type 就是这个情况的最好说明。


@ALL
楼主列举的优点是从实战的角度去谈,说的很客观。实际上 Go 的安利文基本上都属于这种。你见过哪篇 Go 的安利文是“ Go xxx 特性多么牛”,“ Go 又实现了个性特性,能 XXX ”....... 没有,一个也没有。
说 Go 好的基本都是从工程化,项目的角度去谈,比如它的标准库很不错,部署很方便,编译快开发效率高有种使用动态语言的感觉,写并发变得简单了些等等。但很多人却不从这个角度去谈,而是专挑语言本身的问题。语法怎么怎么地?没有 xxx 特性,你看看谁谁谁写的文章大骂 Go 是垃圾等等等,这些东西站的角度不同,看到的结果自然会不同。 Go 优缺点并存,你看不到它好的只看到缺点,更是用都没用过,那还能说出什么有意义的东西出来。比如上面有人不断提到“ Go 没有泛型”,这是不是个问题?当然是。但楼主的这个贴,以及所引用的场景,写 10 万行代码都不会有一次要用到泛型的。再就是包管理的问题, Go 做的很差。这个可以展开说,尽情吐槽,有理有据都成。但 Go 的包管理一定不会做成 npm 以及 Rust 的 Cargo 那样的。为何 Go 一开始没有包管理?因为 google 内部自己就从来不用这玩意儿,所以 Go 的开发者也就没有搞这些。实际上 1.5 , 1.6 包管理的进展到实现大部分都是 Go 社区那些人搞的(比如 vendor 那个具体方案就是非 google 的人提出的被采纳了)。

最后,心态都开放一点, Go 不能完全取代 node(至少在 web 开发这一块, Go 没有机会。服务端 Go 很擅长),不用这么怕,充满火药味,它们都是工具,让你的生活变得简单些。这里有个 2 年前的 Go 和 Ruby 的撕 b 贴,很长但没有那么浓的火药味,回帖质量挺高的( https://ruby-china.org/topics/14407)。

转一段 The Little Go Book 上的一段话,看看 Go 与 ruby,python , c/c++/java 间的关系, Go 目前到底适用用来做些什么事情。
Go was built as a system language (e.g., operating systems, device drivers) and thus aimed at C and C++ developers.
According to the Go team, and which is certainly true of me, application developers, not system developers, have
become the primary Go users. Why? I can ’ t speak authoritatively for system developers, but for those of us building
websites, services, desktop applications and the like, it partially comes down to the emerging need for a class of
systems that sit somewhere in between low-level system applications and higher-level applications.
Maybe it ’ s a messaging, caching, computational-heavy data analysis, command line interface, logging or monitoring.
I don ’ t know what label to give it, but over the course of my career, as systems continue to grow in complexity
and as concurrency frequently measures in the tens of thousands, there ’ s clearly been a growing need for custom
infrastructure-type systems. You can build such systems with Ruby or Python or something else (and many people
do), but these types of systems can benefit from a more rigid type system and greater performance. Similarly, you
can use Go to build websites (and many people do), but I still prefer, by a wide margin, the expressiveness of Node or
Ruby for such systems.
There are other areas where Go excels. For example, there are no dependencies when running a compiled Go program.You don ’ t have to worry if your users have Ruby or the JVM installed, and if so, what version. For this reason, Go is becoming increasingly popular as a language for command-line interface programs and other types of utility programs you need to distribute (e.g., a log collector).
chiu
2016-04-04 11:06:10 +08:00
@demomaster 说 C 的 语法 简洁,没问题啊
jjx
2016-04-04 11:20:41 +08:00
每次看到动态语言项目不能大于 5k 行言论就感到莫名的喜感, 开发者的结构能力, 设计能力到哪里去了, 没有编译型语言的支持, 连大于 5k 行的项目都做不了, 真真是可笑的很.
jsyangwenjie
2016-04-04 11:32:25 +08:00
不觉得你这个标题是来好好讨论的标题
levn
2016-04-04 11:33:43 +08:00
果然这种帖子最火。。。
arden
2016-04-04 11:37:35 +08:00
要我再做一次选择,我应该不会选 nodejs 来做项目了,折腾过得出来的经验。

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

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

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

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

© 2021 V2EX