我是如何学习 Go 语言的

以下文章来源于Golang 成神之路 ,作者T

最近经常有人问我如何学习 Go 语言,这里统一回复一下,以后就不单独解答了。也希望能给后来人一点启示,少走一点弯路。

我是在 14 年,也就是研究生二年级接触 Go 语言的。起因是当时打算求职的一家外企正好在使用 Go 语言,也是比较好奇。花了一周时间简单过了一遍 spec,跑了一遍官网的 demo,当时的感觉这玩意真的是简单啊,就是带了 gc 的 C 语言啊,对于我们这种 C/C++ 出身的人上手不要太快。我记得那会 Go 应该是还不能 bootstrap,还需要借助 gcc 来编译,而且 gc 也没有并行化,整体来说还非常简陋。
15 年毕业如愿入职上面说到的那家公司,这家公司的核心业务是互联网视频广告,对广告稍有了解的人都知道广告系统对延迟及其敏感,所有 Go 只能用来写点小玩具,那会对 Go 的印象也仅限于此。然后在这一年也一直在关注 Go 不温不火的发展着。直到 2016 年滴滴和头条开始大规模使用 Go 语言来重构之前的老系统(滴滴的 php,头条的 python)。以 Python 为代表的动态语言以开发效率著称,但是运行效率落后 C++ 一个数量级,在公司规模大了之后,服务器成本如果降低到之前的十分之一还是能省很多钱的。
2016 年的滴滴发展也是如日中天,加上外企过于安逸,我也就随大流去了滴滴。在滴滴也就开始了真正大规模使用 Go 语言来构建线上系统。这一年也是我技术野蛮生长的一年。当时我们部门的好几个线上项目都是我从 0 到 1 来构建的,当时为了少写业务代码,还特地写了一个代码生成器,将一周的工作量在几个小时解决掉了。很多做技术的同学都会迷恋底层技术,所以那个时候我将网上可以找到的所有的 Go 语言的底层的资料都读了一遍,但是能够深入去写的真的很少,然后我就去读 Go 的源代码。Go 的有些函数是使用的汇编语言 Plan9,不得不有捡起了多年不碰的汇编语言。然后我将这些底层源码实现整理成文章,基本上是当时网络上面第一批解析底层源码的文章。

总的来说,2016 年的 Go 语言的底层学习浪费了我非常多的时间,如果现在可以重来的话,我一定不会花这么多时间去看底层的源码。现在回头看那些源码剖析的文章,很多细节都已经不记得了。从某种程度上讲,当时花费出去的时间限制还没有对我的职业生涯产生很大的作用。相反,我会去读 Go 语言编写的项目代码,去学习优秀的编程范式,而不是钻到知识的底层而沾沾自喜。
2016 年末我终于意识到一个问题:一个真正优秀的程序员,光对语言的深入理解是远远不够的。举个简单的例子,如果让你去实现 http 服务的 router,你会如何实现?最简单的是用一个 map 将 router 和 handler func 存起来,但是这是远远不够的,比如说正则的情况如何处理?对于这个问题,一个比较优秀的解法是使用 Radix Tree 来实现。我相信在座很多人肯定都不记得 Radix Tree 是啥东西了。

说了这么多,我只是想说对于程序员来说真正的核心竞争力是数据结构与算法、操作系统、网络、计算机体系结构这些真正的核心知识,而不是某个语言的语法糖。
2017 年之后,我对于 Go 语言的学习开始转向 Cloud Native 技术栈。学习 Docker,Kubernetes,Prometheus 这些技术的设计思想和编程范式。我们现在也看到了 Go 语言现在唯一可以说占有绝对统治地位就是 Kubernetes 及其生态。

所以总结一下我的这些经历可以给大家哪些启示,我想主要有以下几点:

  1. 学习最好是以点带面地学习,而不要求大而全。优先学习工作中使用到的技术栈或者能对工作产生积极影响的技术。
  2. 通过优秀的项目去学习 Go 语言,比如各种 web 框架,docker,Kubernetes,Prometheus 等,去学良好的编程范式。
  3. 很多底层知识看起来很酷,其实在工作中可以起到的作用并没有想象中那么大,不妨在真正需要深入的时候再去深入学习。
  4. 学习一门语言,前期不要陷入到语言的细节当中去,做到心里有数,用到的时候查阅就行。
  5. 对于 Golang 程序员来说,只学好 Go 语言是远远不够的。

啰啰嗦嗦一大篇,希望能够给大家一点启示。如果觉得不错,可以点一下右下角的“在看”。

9