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

24606 次点击
所在节点    Go 编程语言
180 条回复
chenqh
2020-10-03 21:41:33 +08:00
@jingniao 你这种一不小心 error 就丢掉了,难怪你换 golang 业务不崩了
mosom
2020-10-03 21:49:53 +08:00
项目需要刚开始学...... 看你们吵得好凶的样子 [开始看书入门
ErrorMan
2020-10-03 21:50:16 +08:00
接触过其它几门语言,感觉 golang 的语法有点太过原始,本来可以很好区分的流程被强制混在一起,心智负担很大。我觉得这不是为了性能妥协的问题
blless
2020-10-03 21:51:19 +08:00
@WispZhan 维护简单,代码维护本质就是给人看。Go 足够简单就是优势,甚至跟楼主说的一样,不需要很高深知识就可以开始尝试阅读大型项目源码。其他语言里面不敢想
littlewing
2020-10-03 22:12:04 +08:00
@chenqh 写过 C 的表示很正常
chenqh
2020-10-03 23:12:46 +08:00
@littlewing C 语言在我的印象里面就不是用来写业务的语言,是用来写底层的语言
TypeError
2020-10-04 00:09:36 +08:00
我用 go 就看这两点,比 Python 性能好并且静态类型,
比 Java 启动快内存占用少,并且有高阶函数 Goroutine 等,不用看那一堆过度封装
buffzty
2020-10-04 00:24:16 +08:00
c 语言不也是 if err 这种吗 go 和 c 一模一样 为什么喷 go? 喷子们没学过 c 吗 是培训班出来的吗
ruyu
2020-10-04 00:38:48 +08:00
我一直觉得语言学得越多思维越开阔. 各种各样的语法, 思路, 理念都见识过, 就不会觉得某种语言的用法奇葩了.
JerryCha
2020-10-04 01:17:33 +08:00
error code 大法好,try...catch 和 error 都是异端!
tianshilei1992
2020-10-04 01:42:24 +08:00
继续用我的 C++ 了 😂
cassyfar
2020-10-04 02:20:35 +08:00
作为一个 java 转 go 不到一年的人,表示还是 try catch 好用,毕竟明确划分了错误类型。说 if err != nil 能减少崩溃的人。。。可能是自己问题吧,任何崩溃也不能赖语言上啊。
mageemeng
2020-10-04 03:01:19 +08:00
N 年前听播客,说 Java 不行了,不碰 Java
N-1 年前说 PHP 是世界上最差的语言,不碰 PHP
现在 Java 企业中该用还得用、PHP 写的好应用也不少......
deepreader
2020-10-04 05:28:23 +08:00
errlang
dcoder
2020-10-04 07:36:10 +08:00
确实最后都成了争论 err != nil 好不好, 哈哈哈
hst001
2020-10-04 07:49:43 +08:00
加个泛型不会增加多少难度,rust 如是说。
ypcs03
2020-10-04 09:50:04 +08:00
别的不说 go 的语法写起来超快,写起小工具比写 bash 还快,现在刚开始学 rust 感觉复杂多了。
woshifyz
2020-10-04 09:55:32 +08:00
真的搞笑,就 go 这种语言,不就几天就上手了吗,后面工作要用再深度研究呀,现在难道招聘会那么看重语言,都是看综合素质的呀
ai277014717
2020-10-04 10:22:14 +08:00
写了几个小时 go 感觉自己更像搬砖的了。copy 改改改 copy 改改改
dbskcnc
2020-10-04 10:53:29 +08:00
@WispZhan 泛型出来后采纳的人只多不会少的, go 不适合业务逻辑的结论也太武断了

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

https://yangjunhui.monster/t/712344

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

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

© 2021 V2EX