You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

99 lines
12 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 结束语和你一起迎接Go的黄金十年
你好我是Tony Bai。
在虎年春节营造的欢乐祥和的气氛中,我们迎来了这个专栏的最后一节课。
这个专栏的撰写开始于2021年5月中旬我使用GitHub仓库管理专栏文稿这是我的第一次提交
![图片](https://static001.geekbang.org/resource/image/de/62/de2a005cb6bd57c9b9cb004d2fe20362.png?wh=1068x252)
从那时开始我便进入了专栏写作的节奏。从2021年5月到2022年2月9个月的时间我洋洋洒洒地写下了20多万字估计值写作过程的艰辛依然历历在目。
你见过凌晨4点你所居住的城市吗我每周至少要见三次。你每天能睡多长时间呢45个小时是我的常态。在日常工作繁忙家里带俩娃的背景下这算是挑战我自己的极限了但当我看到有那么多订阅学习专栏、认真完成课后思考题以及在留言区留言的同学我又顿感自己的付出没有白费我的自我挑战是成功的。
**“老师,你跑题了!”**
不好意思,小小感慨了一下。我们还是回到结束语上来。我想了很久,在这最后一讲里,还能给你说点什么呢?人生大道理?职涯规划建议?轻松的、搞笑的段子?可惜这些我都不擅长。最后,我决定借着这篇结束语,和你聊聊下面这几件事,请耐心地听我道来。
## 专栏回顾与“与时俱进”
在下笔写这篇文章之前我认真回顾了一下这门课的内容对照着Go语言规范细数了一下这门课覆盖了绝大多数Go语言的语法点这为你建立Go语言的整体知识脉络后续继续深入学习奠定了基础。这也是我在设计这门课的大纲时的一个基本目标现在这个目标算是实现了。
而且从同学们的留言反馈情况来看彻底抛弃GOPATH把Go Module构建模式、Go项目布局的讲解前置到入门篇中是无比正确的决定。相信你在学完这些知识点后即便遇到规模再大的Go项目也能“庖丁解牛”快速掌握项目的结构并知道从何处开始阅读和理解代码这为你“尽早地动手实践”提供了方便。
另外这个专栏对一些语法概念比如切片、字符串、map、接口类型等进行了超出入门范畴的原理性讲解也得到了来自同学们的肯定这也算是这个入门课的吸睛之处。
不过课程依然存在遗憾,其中最令我不安的就是对“指针”这个概念的讲解的缺失。在规划课程之时,我没有意识到,很多来自动态语言的同学完全没有对“指针”这个概念的认知,我的这个疏忽给一些同学的后续学习带来了困惑。为了弥补这个遗憾,**我会在后面以加餐的形式补充对Go指针的基础讲解**。
按理说写完这一讲后我们的这个专栏就正式结束了。但我们都知道即将发布的Go 1.18版本将加入泛型语法特性对于定位为“Go语言第一课”的本专栏来说对泛型语法的系统讲解肯定是不能缺少的并且Go泛型很可能会是Go语法特性的最后一次较大更新了。
虽然我们已经通过加餐聊过泛型了但那些还是比较粗线条的所以在2022年Go 1.18泛型正式发布后我会补充泛型篇通过大约3节课给你系统、全面地介绍Go泛型语法的细节。我们的专栏也要做到“与时俱进”
## 接下来,我该学点啥?怎么学?
就像这一讲的头图所写的那样这节课的结束不是你Go语言学习的终点而是你深入和实践Go的起点。专栏的留言区也有同学在问Go应该如何进阶呢进阶的话我该学点啥呢
这里我借用“T字形”发展模式按**语言深度**与**工程宽度**两个方向在一幅图中列出Go进阶需要了解的知识与技能点
![图片](https://static001.geekbang.org/resource/image/e4/d6/e42620d46eb73692d9c5c1479d6244d6.jpg?wh=1920x1047)
沿着“语言深度”这条线我们看到在纯语言层面的进阶我们要学习和理解的知识点还有很多包括这个专栏没有包含的反射reflect、cgo与C语言交互的手段、unsafe编程等高级语法点还有迈向Go高级程序员必要的Go编译器原理、Go汇编、Goroutine调度、Go内存分配以及GC等的实现细节。
当你掌握这些之后你就会有一种打通“任督二脉”的感觉再难的Go语言问题在你面前也会变得简单透明。更重要的是这会让你拥有一种判断力可以**判断在什么场合不应该使用Go语言**。《Kubernetes UpRunning》一书的作者、Google开发人员凯尔西·海托Kelsey Hightower曾说过“如果你不知道什么时候不应该使用一种工具那你就还没有掌握这种工具”。拥有这种判断力也代表你真正掌握了Go语言。
当然Go语言的进阶同样也离不开工程层面的知识与技能的学习。在上面图中我将工程宽度分成两大块一块是Go标准库与Go工具链另外一块是语言之外的工程技能。这些知识与技能都是你在Go进阶以及Go实践之路上不可或缺的。
那么知道了学啥后,又该如何学呢?
其实,这个专栏中我一直强调的“手勤+脑勤”同样适合Go进阶的学习多实践多思考是学习编程语言的不二法门。
此外,在进阶学习的过程中,我还要向你推荐一种学习方法,同时这**也是我本人使用的方法**,那就是**“输出”**。如果你对“输出”这个词还不太理解,那么你应该或多或少听说过“费曼学习法”吧?
费曼学习法是由诺贝尔物理学奖得主理查德·菲利普斯·费曼贡献给全世界的学习技巧。这个学习法中的一个环节就是**以教促学**,也就是学完一个知识点后,用你自己的理解将这个知识点讲给其它人,在这个过程中,你既可以检验自己对这个知识点的掌握程度,而且也可通过他人的反馈确认自己对这个知识点的理解是否正确。而这个学习技巧的本质就是“输出”。
在如今移动互联网的时代,“输出”拥有了更多样的形式,比如:
* 学习笔记/博客/公众号/问答/视频直播/音频播客/社群;
* 开源/内源项目;
* 内部培训/外部技术大会;
* 译书/著书。
所有的这些形式都要遵循一个共同点:**公开**,也就是将你的“输出”公之于众,接受所有人的检验与评判。这个过程一旦正常运转起来,可以快速修正你理解上的错误,加深你的理解,加快你的学习,并会敦促你主动优化你后续的输出。形成了良性循环之后,再高深的知识点对你来说也就不是什么问题了。
不过古人云:“知易行难”,学会“输出”也需要一个循序渐进的过程。尤其是一开始“输出”时,不要怕错,不要怕没人看,更不要怕别人笑话你。
## Go语言的未来
最后我们再来谈谈大家都关心的话题:**Go语言的未来**。
在我写这一讲的时候,刚刚好著名编程语言排名指数[TIOBE](https://www.tiobe.com/tiobe-index/)发布了2022年2月编程语言排名情况如下图
![图片](https://static001.geekbang.org/resource/image/71/0b/715a7e555baa58dbf9279b51d95acb0b.png?wh=1916x1486)
在这期排名中Go上升到第11位相较于2021年年底各大编程语言的最终排名以及2021年2月份的排名都上升了2位。Go语言位次的提升在我的预料之中。TIOBE在1月份发布的2021年年终编程语言排行榜的配文中也认为除了Swift和Go之外尚不会有新的编程语言能迅速进入前3名甚至前5名这也在一定程度上证明了TIOBE对Go发展趋势的看好。
再老生常谈一下纵观近十年来的新兴后端编程语言Go集齐了成为下一代佼佼者需要的所有要素名家设计三巨头、出身豪门谷歌、杀手应用Kubernetes、精英团队Google专职开发团队、百万拥趸、生产力与性能的最佳结合以及云原生基础设施的头部语言。
在2021年为了加强Go社区建设与Go官网改进Go团队雇佣了专人负责。Go核心开发团队专职人员的数量逐年增多根据[Go核心团队工程总监萨梅尔-阿马尼(SAMEER AJMANI)在之前Go Time的AMA环节中透露的信息](https://changelog.com/gotime/210)当前Go核心团队的规模已经达到了50人
![图片](https://static001.geekbang.org/resource/image/81/98/81d5425114f6eed69c78124d3a59ea98.jpg?wh=800x111)
而且Go语言在国内的发展也是越来越好。大厂方面腾讯公司近几年在Go语言方面投入很大不仅让Go语言成为其公司内部增速最快的语言腾讯还在2021年发布和开源了多款基于Go开发的重量级产品。
字节跳动更是国内大厂中拥抱Go语言最积极的公司之一它的技术体系就是以Go语言为主公司里有超过55的服务都是采用Go语言开发的。长期的Go实践让字节跳动内部积累了丰富的Go产品和经验2021年字节也开启了对外开源之路并且一次性放出了若干个基于Go的微服务框架与中间件产品包括kitex、netpoll、thriftgo等。这些开源项目统一放在[https://github.com/cloudwego](https://github.com/cloudwego)下面了。
除了大厂积极拥抱Go之外小公司与初创公司也在积极探索Go的落地。根据我从圈子里、周边朋友、面试时了解的情况用Go的小公司/初创公司越来越多了。究其原因还是那句话:**Go语言是生产力与战斗力的最佳结合**。这对小公司/初创公司而言,就是真(省)金(人)白(省)银(机器)啊。 甚至Go已经渗透到新冠防疫领域我前不久得知河北移动支撑的新冠疫情流调系统的后端服务也是用Go实现的。
2022年Go语言的最大事件就是3月份**Go 1.18的发布以及Go泛型的落地**。泛型的加入势必会给Go社区带来巨大影响。随之而来的将是位于各个层次的Go包的重写或重构底层库、中间件、数据结构/算法库乃至业务层面。这一轮之后Go社区将诞生有关于Go泛型编码的最佳实践这些实践也会反过来为Go核心团队提供Go泛型演化与在标准库中应用的素材。
在我们专栏的第一讲[“前世今生你不得不了解的Go的历史和现状”](https://time.geekbang.org/column/article/426282)中,我曾提到过:**绝大多数主流编程语言将在其诞生后的第15至第20年间大步前进**。按照这个编程语言的一般规律已经迈过开源第12个年头的Go很可能将进入自己的黄金5-10年。而2022年就很大可能会成为Go语言黄金5-10年的起点并且这个标志只能是Go泛型语法的落地。
按照Go语言的调性在加入泛型后Go在语法层面上很难再有大的改变了错误处理将是最后一个硬骨头也许在泛型引入后Go核心团队能有新的解决思路。剩下的就是对Go编译器、运行时层、标准库以及工具链的不断打磨与优化了。到时候我们就坐收这些优化所带来的红利就可以了。
经过这些对Go语言当前状态和未来可能演化路线的分析你是不是对Go的未来更加有信心了呢
学习Go语言十余年的我很庆幸也很骄傲当初做出了正确的选择。最后**在Go即将迎来黄金十年的历史时刻希望你能在Go语言之路上走的更远并实现你的个人价值**。
[![](https://static001.geekbang.org/resource/image/0a/25/0a8b8d870401fa225c607450a916f625.jpg?wh=1142x801)](https://jinshuju.net/f/AclglJ)