要学 Go 的赶紧上车

2020-10-03 12:59:17 +08:00
 kidlj

Go 预计在 2021 年开始支持范型,那个时候代码对新手的复杂度将提升一个量级。当前 Go 语言只有一种明显的抽象,就是 interface (接口),范型是另一种,而且比接口要更难以理解和编写、阅读。

2017 年我决定转 Go 的时候,调查了社区的成熟度,比如 kafka,redis,mongo,mysql,pg 等等中间件的库是否完善,那时候这些该有的都已经有了。现在又过了三年,Go 的社区更加成熟了,特别是 Docker 和 Kubernets 主导的云原生生态的崛起,Go 语言占了半壁江山还多。

前一阵坐我背后的一个写 Python 的同事在学习 Go,问我一个简单的问题。一个函数的返回值是 error 类型,被他当作是返回变量,因此代码看不懂。这可能是只写过动态类型语言( python, javascript, php 等)都要面对的一个思维转变。这个时候学习 Go,除了静态类型的思维转变以及 interface 这一层抽象,你会发现 Go 大部分时候像一个动态类型的语言,而且特性非常少(比 Python 少得多),Go 开源代码和标准库也非常 accessible 。

不过当范型推出来以后,虽然从 draft design 来看范型的设计已经非常简单,但对于没接触过静态类型语言的同学来说这是一个不小的挑战,甚至函数的签名都难以分辨。因此这是一个肉眼可见的复杂度提升。而且可以预计的是,当范型可用的时候,社区里大量的开源项目和库将迁移到范型的实现(因为代码更紧凑和通用),我觉得那个时候代码不会像当前一样 accessible 。

所以这个时候上车,用大约半年到一年时间熟悉 Go 的静态类型和 interface,等到范型推出的时候,可以比较轻松地过渡过去。

下面是一些学习资料的推荐:

  1. <The Go Programming Language> 是 Brian Kernighan 和一位 Go 开发组成员 Alan 合写的一本书。虽然这本书出来好几年了,但是 Go 从 1.0 以后就没怎么变化,所以还是很适用。推荐阅读英文版,中文版在大部分时候翻译得不错,但是在一些难以理解的部分,翻译并不能让事情更容易理解,甚至还会出现错误。
  2. Web 框架推荐 Echo 。写过 Node.js 的同学会发现,Echo(或 gin ) 就是 Express 或 Koa 的翻版,都是 middleware 和 c.Next 的执行方式,属于极简框架,很容易上手。
  3. Go 的并发很简单,只有 Goroutine 和 channel 一种方式。官方出的那本书里讲解得非常清晰,必读。不过一开始如果理解起来有困难的话,甚至可以跳过,因为很多时候不太用得着。比如用 Echo 框架来写业务,大部分时候不涉及并发,并发是在 Echo 框架的层面实现的(一个请求一个 goroutine ),所以业务代码就不需要并发了。
  4. Go modules 很好用。新推出不久的 pkg.go.dev 可以查询某个库被哪些开源项目 import,可以方便地学习这个库的使用方式。比如想看哪些开源项目使用了 Echo 框架,点开 Echo 的 import by tab 就看到了。这里是示例: https://pkg.go.dev/github.com/labstack/echo/v4?tab=importedby

我写 Go 有两年时间,肯定不算是一个 Go 的高手,但也不害怕去阅读一些大型项目的代码,比如 Kubernetes 。这就是 Go 的魔力,very accessible 。就像上面说的,当范型被大量运用以后,难度应该要提高一个量级。这是我的一点点经验,分享给大家,希望有帮助。

23923 次点击
所在节点    Go 编程语言
180 条回复
zxCoder
2020-10-03 15:51:40 +08:00
最近在学 go
Zchary
2020-10-03 16:00:03 +08:00
目前还在 node 苦海中寻找出路,如果有要学习第二门后台语言当然选择 go,我可受不了 Java 那过度的设计模式和语法规则
herozzm
2020-10-03 16:06:27 +08:00
喜欢 if err,不喜欢 try
mikulch
2020-10-03 16:09:15 +08:00
麻烦问下中文到底推荐哪本书?谢谢了。网上的书,全是差评啊。
mikulch
2020-10-03 16:10:45 +08:00
@Zchary go 语言,变量是不是越短越好
fakeshadow
2020-10-03 16:31:16 +08:00
不懂泛型哪里难
Nugine0
2020-10-03 16:32:08 +08:00
Rust 才应该是真正的云原生语言,没开玩笑。
正反论据都很多,就不列举了。
wzw
2020-10-03 16:33:36 +08:00
@mikulch 也早有意义吧
impig33
2020-10-03 16:35:44 +08:00
go 是用来干啥的
mikulch
2020-10-03 16:38:38 +08:00
@impig33 写 web 写业务,增删改查
chengxiao
2020-10-03 16:53:24 +08:00
我是觉得 interface 已经够用了
go 没有那么多语法糖和写法,所以看项目审代码容易的多....
以前看 python 项目,各种炫技语法糖..常常不明白作者的用意,life 一点也不 short
hanjie
2020-10-03 17:07:53 +08:00
Java 创始人最近谈十几年前设计初衷: https://www.zdnet.com/google-amp/article/programming-languages-java-founder-james-gosling-reveals-more-on-java-and-android/ ,当初所有设备都在重复造轮子,以及处理内存安全问题,所以新语言简单(c style)安全,和性能做了 trade-off 。go 看上去略有点 KPI 项目性质,堆了太多复杂的东西,很多高级特性其他语言也可以轻易实现, 之前王 yin 大神的吐槽: http://www.yinwang.org/blog-cn/2014/04/18/golang

google 原来想用 go 代替 c++,结果 c++的人没有转,写 c 的人转了。java 的人有一小部分赶时髦的在边缘业务尝试。还是那句话,“如果 rust 被证明很有钱景,那么地球一夜之间将会多出 100 万 rust 程序员”
reus
2020-10-03 17:15:16 +08:00
@dahhd 我看你小学语文都没学好,建议你找个小学生
reus
2020-10-03 17:18:42 +08:00
@dahhd 我看你小学语文都没学好,建议你找个小学生,缩写一下我说的话,把句子成分搞清楚!
vision1900
2020-10-03 17:26:46 +08:00
@kangsheng9527 手写跨域后发现还是得用框架
reus
2020-10-03 17:40:51 +08:00
@Jirajine 一看就是和王垠一样,根本就是半桶水。谁告诉你 err 和 val 肯定一个是零值一个不是的?
例如最常见的 io.Reader 接口,返回值是 int, error,这两个可能同时非零,例如返回 42, io.EOF ,这种场景你怎么用 union type?
之前有一个提案可以这样写 f2(check f1()),不过没通过。这种写法并不完美,你可以去 github 看看讨论。
jingniao
2020-10-03 17:51:33 +08:00
@chenqh 即使是抛也是显式抛,直到合适的调用层处理它,也是处理了错误,当然怎么处理就跟业务和个人习惯个人能力有关了。
python 把错误跟异常混在一起,只能到处 try,或者最外层 try,一不注意本来可以忽略的错误没处理就上抛影响业务了。
mangogeek
2020-10-03 18:14:34 +08:00
@chenqh 我恰好想法, 以前写 linux C 的,看到 if err 反而很亲切
huangsh
2020-10-03 18:33:54 +08:00
水军,老咔叽玩意
Mohanson
2020-10-03 18:38:16 +08:00
11 年过去了你们还在讨论 if err != nil …

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

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

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

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

© 2021 V2EX