要学 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 。就像上面说的,当范型被大量运用以后,难度应该要提高一个量级。这是我的一点点经验,分享给大家,希望有帮助。

23841 次点击
所在节点    Go 编程语言
180 条回复
chenqh
2020-10-03 13:02:29 +08:00
我就问你怎么忍受 if err 的
chenqh
2020-10-03 13:03:24 +08:00
感觉 err 和病毒一样,弄的我几乎每个 function 都要带 err
labulaka521
2020-10-03 13:06:19 +08:00
@chenqh 我觉得这样挺好 明确每一个函数的返回是否报错 虽然很麻烦
dcalsky
2020-10-03 13:06:33 +08:00
等等党永远不亏。
kangsheng9527
2020-10-03 13:08:23 +08:00
不用泛型就可以了。。。所以难度没变。。。

我从不推荐使用各种框架。。。

我推荐尽可能使用原生库去完成项目,尽量少使用第三方库。。。

所以也不推荐写 web 用 echo 框架之类。。。

减少中间商赚差价。。。
lewinlan
2020-10-03 13:08:34 +08:00
1. 当前的泛型设计对使用方来说几乎无感。
2. 会学的早就上车了,不愿学的多说无益。
3. 敢用 go 的公司太少。估计只有等字节跳动开始向社会输出人才,这玩意才能在国内普及开。
kidlj
2020-10-03 13:08:52 +08:00
@chenqh 相反,我很喜欢 err != nil 的处理方式,我相信很多已经在写 Go 的人也是同样的感受( Twitter 上很多 Go 社区的人为此辩护)。审美问题,不是大事儿。
kidlj
2020-10-03 13:12:18 +08:00
@lewinlan 范型无缝衔接是对于已经使用过静态类型语言比如 Java 或 Go 1 的人来说的。对于只有动态类型语言经验的人来说,interface 的一层抽象,再加上范型的一层抽象,还是会造成一定程度的困惑的。
lewinlan
2020-10-03 13:15:38 +08:00
@kidlj 两层抽象学不会的话,建议转行 (狗头
不过我认同你的观点,泛型出来之后整个语言的复杂性会明显提升。
kangsheng9527
2020-10-03 13:16:09 +08:00
@chenqh 带 err 总比 java try catch 高端。。。符合 c 语言特性。try catch 才是最费时的。。。

当然你也可以改成 java try catch 模式,以代码是正常运作的都是‘好人模式’,所以不存在错误,错误只是小概率所以你可以使用 defer + recover 去捕捉 panic 然后恢复。
recover 相当于 catch 了。。。
whincwu142
2020-10-03 13:18:23 +08:00
继续学我的 C/C++
chenqh
2020-10-03 13:20:20 +08:00
@kangsheng9527 高端什么?写业务的时候,你用 err 代码比 try catch 多了不知道多少,关键的是写 golang 的忽略 err 比 try catch print 不知道多了多少
kangsheng9527
2020-10-03 13:29:18 +08:00
@chenqh 顶层的 web 业务写多了 ,就知道需要向底层进攻斗不过底层程序员了,谁掌握底层核心谁拥有话语权,底层全是 c 语言啊,,,那些什么 sys 驱动文件都是 c 写的啊,,,你想做自定义高点的 vpn 都得接近底层啊。。。而不仅仅只是调用人家 api 。。。

反正代码行业从 c 起步才是正确的而不是从 java 起步。。。以后到了与 360 那个级别竞争就知道了。。。或者被绝对底层监控录屏而无可奈何,技术没人家那么底层所以无可奈何。。。

那些评激 go 语言 err 处理的都不是 c 起步的人。。。都是 c#、java 起步的人。。。
chenqh
2020-10-03 13:35:11 +08:00
@kangsheng9527 说的好像 golang 现在不是用来写 web 一样,如果 golang 老老实实做他的中间层,底层,他用 err 还是 try catch 我才不管,但是现在很多都是用 golang 来写 web,你用 err 还是 try catch 就和我有关系了
coyove
2020-10-03 13:41:24 +08:00
err 强迫你思考每个函数的 fail path,exception 强迫你思考整个函数的 fail case 。go 出来之前大家都觉得前者没有工程性,但后来 go 确实也证实了这条路是完全没问题的
kidlj
2020-10-03 13:42:07 +08:00
@chenqh @kangsheng9527 err != nil 的处理方式真的只是审美问题,三位创始人的审美。当前有很多支持的声音,也同样有很多反对的声音。Go 开发组包括社区也一直在寻找解决方案,不过看起来比范型还要难以处理,因为 err != nil 是最简单的形式了,不能再简化了,而它偏偏又能解决所有的错误处理需求。Robert Griesmer 之前 proposal 了一个 try 关键字,被社区否定撤回了,还有很多其它的 proposal 都是一样的命运。这不是一个缺陷,而且自有它的优点和大量拥趸,所以我说这是一个审美问题。请不要在这里争论这个问题了。
chenqh
2020-10-03 13:53:07 +08:00
@coyove 怎么可能没问题,如果没问题,知乎为什么不走 err ?
zhangysh1995
2020-10-03 14:04:33 +08:00
@coyove 完全同意你的观点。感觉写 golang 想到了错误处理之后,程序很少崩了。脚本原来用 Python 写,动不动跑着就挂了,还看不太出来什么原因。我个人还是觉得静态语言在复杂使用情景下面更稳一点。
qzy168
2020-10-03 14:07:44 +08:00
有书吗?想学。
huiyifyj
2020-10-03 14:08:59 +08:00
天天喷 if err 也是服了,写出来好看代码的语言有几个?

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

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

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

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

© 2021 V2EX