粗大事了:花两天时间学习了 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 ?

54089 次点击
所在节点    Node.js
197 条回复
vdo
2016-04-03 16:56:59 +08:00
第三方包多不多
aszxqw
2016-04-03 17:00:14 +08:00
@xhowhy 见 18 楼。
xhowhy
2016-04-03 17:00:27 +08:00
@vdo 反观 npm 的缺点就是第三方包太多。。 go 的系统模块比 node.js 更强大一些
pathletboy
2016-04-03 17:00:33 +08:00
@aszxqw golang 1.5 开始有 vendor 机制,现在 go 1.6 已经默认开启,可以初步解决版本依赖问题,当然,在包管理上和 NPM 比起来,是有差距。
miyuki
2016-04-03 17:01:31 +08:00
No visible "this".
RqPS6rhmP3Nyn3Tm
2016-04-03 17:03:32 +08:00
@xhowhy 当你学 C 的时候虐得死去活来(尤其是指针),真的不觉得 C 比 Python 简洁……
xhowhy
2016-04-03 17:05:18 +08:00
@aszxqw Godep 是 Go 社区开发的一个包管理工具,似乎已经要集成到 Go 1.6 了,你说的问题可以解决,但方案应该不是变成下一个 npm 。你看看 npm3 后 npm 社区开始撸平目录了,还改进了 peerDependency 字段,但还是不能彻底解决一个项目下多版本混乱的问题。以后随着组件的慢慢升级,这个问题应该会被解决,但还需要时间。。
aszxqw
2016-04-03 17:05:52 +08:00
@pathletboy vendor 机制和 godep 一样都是把源码加入 git 管理。容易导致因为依赖的包多,导致本仓库代码巨大。
而没法做到像 npm 那样,可以直接通过 package.json 自动下载依赖版本。
go 的包管理诟病这么久,我还以为能在 1.5 开始会出现转机,但是目前看到 vendor 相对于 godep 没有任何改进,令人失望。
xhowhy
2016-04-03 17:06:51 +08:00
@BXIA 一直觉得指针挺 So easy 啊
aszxqw
2016-04-03 17:07:39 +08:00
@xhowhy 如果 godep 能有自动下载的功能,而不是把所有依赖都加入 git 自己管理。那么确实可以解决。
但是目前没有看到任何进展。
pathletboy
2016-04-03 17:09:09 +08:00
@BXIA 你说的不是语法问题, C 的语法简单是毫无疑问的,用不好指针的时候,你学 python ,也会被虐的死去活来, C 面向过程,而 python 面向对象,就这点上来说, python 不会比 C 简洁。
zhuangzhuang1988
2016-04-03 17:10:58 +08:00
调试呢, repl 呢。。
RqPS6rhmP3Nyn3Tm
2016-04-03 17:12:35 +08:00
@xhowhy
@pathletboy 受教了
longaiwp
2016-04-03 17:15:54 +08:00
@BXIA 不要对任何东西抱有信仰,任何!你要说简洁, C 真的就是简洁,甚至可以说简陋, Python 在易用性上高不知道哪里去了,也可以说是一种“简洁”,就好像你不能说 Osx 被文件管理和应用缺乏折磨就觉得 Osx 怎么样
xhowhy
2016-04-03 17:15:58 +08:00
@aszxqw 了解了, go get 设计上也是过于乐观了。
ivenlee
2016-04-03 17:16:00 +08:00
Python 挺好,就是谈起性能有点尴尬(别的动态语言不要笑!你们好不到哪里去)。

Go 在语法上有点像 Python+C ,而它是静态的,很多在 Python 很自然的用法可能在 Go 中未必是这样(等专家解释)

gofmt 挺好,规范手册很容易忘记,不同的团队可能有不同的规范,所以比较认同用工具来做这个工作。 Python 不需要这样的工具?把所有缩进删了真的能 format 回来吗?很好奇!

GoImports ? import 了未使用的包是不能编译的,给个警告就好了嘛,等真正要发布的时候再一次 GoImports 不行吗?这么专制干什么? 要知道啪啪啪的过程中多次被打断是什么样的滋味。

go run ./main 是不被支持的,而且 go run 是编译了放在 /tmp 中的,使用于相对路径的代码要注意点。还是老老实实 build 了之后再执行吧。
raincious
2016-04-03 17:16:02 +08:00
Golang 的 Vendor 机制还是不太成熟, NPM 这方面好太多了。希望未来 Golang 只使用 Vendor 机制来进行包管理,然后有个命名空间一样的东西,而不要用 URL 。

关于性能:
http://benchmarksgame.alioth.debian.org/u64q/go.html

还有跟 Rust 的比较:
http://benchmarksgame.alioth.debian.org/u64q/compare.php?lang=go&lang2=rust

还有跟世界上最好的语言比较:
http://benchmarksgame.alioth.debian.org/u64q/compare.php?lang=go&lang2=php
quix
2016-04-03 17:18:47 +08:00
赞扬一个东西时候一定要拖个尾巴贬低一样东西, 这种行为到底算什么病...
Nixus
2016-04-03 17:18:57 +08:00
@xhowhy 昨天刚刚下决心离开 go ,回到 php 的怀抱!这下好了,你一个帖子又把俺拉回去了!!!
指针 So easy +1
aabbccli
2016-04-03 17:24:04 +08:00
不喜欢 gofmt

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

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

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

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

© 2021 V2EX