前言
由于时间过于久远,笔者已经记不清首次接触Go语言的具体时间了。回想起来应该是在2009年前后,那时Go 1尚未发布。
当从一个朋友口中听说谷歌公司开发了一门新的编程语言时,笔者并没有太过关注,要不然也不至于记忆如此模糊。其实,如果早知道Go语言能大行其道,或者知道未来要写下这段文字,笔者当时一定会拍下一张自拍照或者发一篇博客来记录那个重要的时刻。
在使用Go语言之前,笔者已经使用过Basic、Pascal/Delphi、C/C++、Java、Scheme、Erlang等诸多编程语言,也尝试写过几个玩具级别的编译器。深知编写一个编译器并不困难,而开发出一门被广泛接受的编程语言却非常不容易。虽然Go语言出自谷歌公司——一个笔者非常喜欢的公司,但在当时那个编程语言已经百花齐放的年代,加上谷歌公司善于关闭项目的传统,使笔者并没有对Go语言抱太大希望,心想这不过是另外一个谷歌公司的“20%项目”而已。不过,为了不让自己显得落伍,也为了和朋友们见面时能有更多的谈资,在听说Go语言几天后的一个晚上,笔者还是下载并试用了它。
Go语言很快就勾起了笔者的好奇心。它飞快的编译速度让笔者吃惊,以至于回到正式工作中的C++项目时,感觉非常不适应。它被很多人诟病的“类型后置”在笔者看来不是什么大问题。因为在学习Basic、Pascal和C的过程中,已经经历了在各种语法习惯之间做思维转换的阵痛,不在乎再转换一次。它通过error返回值处理错误的方式并没有对笔者造成太大困扰,因为在笔者看来这至少要比C语言的errno更优雅、比C++和Java的exception更清晰。另外,它对高阶函数的支持激活了笔者对Scheme和Erlang的记忆,并且瞬间有了亲切感。
就这样,在随后的几天里,笔者一有时间就看上几眼Go语言的资料,直到看到Goroutine和Channel后,笔者彻底被Go语言吸引了。Go语言是笔者接触过的第2个把并发编程设计进语法的编程语言(第1个是Erlang),在这里,并发变得如此自然: 创建一个Goroutine就像声明一个变量一样简单; 使用chan在Goroutine之间通信也像使用队列一般自然,并发不再是一种刻意为之的行为,而是随着软件设计自然形成的。虽然Erlang的并发设计也很优秀,但它对笔者的要求实在太高了,例如循环都要改为尾递归,这也是笔者没有持续使用它的一个原因。那时候,笔者也在试图自己实现一种自认为理想的并发编程模型,但举步维艰。Go
语言的出现,让笔者眼前一亮,也让笔者彻底放弃了重新创造轮子的想法。现在回想起来,当时笔者对并发编程的关注可能来自刚刚购买的那台使用AMD三核心CPU的计算机。不管怎样,Go语言用它优秀的并发设计吸引了笔者。从那以后,笔者的项目只要能用Go语言都尽量用Go,无论是工作上的还是业余爱好上的。
在随后的多年间,笔者写过大量Go代码,也接触了更多使用Go语言的朋友和同事。在此过程中,笔者慢慢感受到了Go语言中一些不那么直观甚至有些反直觉的地方。笔者喜欢刨根问底,经常就这些问题和身边的人及网络上的人进行讨论。在讨论过程中笔者发现如果想避免把讨论升级为争吵,唯一的办法就是“引经据典”: 引用Go语言规范中的相关段落和术语。
引用的次数多了,笔者开始感觉自己存在对Go语言的某些细节理解错误,或认识不够深入的问题,于是索性决定花时间把Go语言规范和标准库文档通读一遍。通过那次通读,笔者不仅解决了一些自己长久以来一知半解却又自以为是的细节问题,还可以回答别人在Go语言使用过程中遇到的疑惑问题。更重要的是,在和别人讨论问题时可以做到言之有据,这种感觉真好。
为什么选择研读语言规范而不是Go编译器源代码?笔者的答案是: 可以仅通过文档就能完整理解的软件才是好软件,仅通过文档来理解一个软件才是最优做法。现代软件工程推崇“封装”,模块的内部实现应该是作者的“私有财产”; 当模块的使用者被屏蔽而不是暴露在模块的内部结构面前时,工作效率才最高。Go语言也是一个软件,通过阅读文档而不是源代码
的方式来学习它才是最有效率的。当然,如果你学习Go语言的目的是为它贡献代码、修改Bug,则熟读源代码是必要条件。笔者相信,对大部分人而言,能熟练地掌握一门语言、能使用此语言实现心中的创意,要比去修改和改进这门语言的现实意义更大。
机缘巧合,能和清华大学出版社合作推出这本书,笔者深感荣幸,也希望自己的经验和教训能帮助到更多的人。在本书成稿的过程中,笔者一直把Go语言规范放在计算机的副屏上,以便随时翻阅和参考。
随着国内软件厂商对Go语言接受程度的提高,越来越多的场合需要Go语言程序员,笔者自己的社交圈子中也有越来越多的人通过Go语言找到了工作。这确实是一件好事,无论是对于Go语言的推广,还是对先进编程人才的培养都是如此。笔者衷心希望这本书能为Go语言的初学者答疑解惑、能为Go语言从业者提供技术参考。让我们一起使用Go语言开发出自己心目中那个值得引以为傲的项目吧。
资源下载提示
源码资源: 扫描目录上方的二维码下载。
鉴于个人能力所限,书中难免存在疏漏,希望读者热心指正,在此表示感谢。
袁晓辉2025年12月于新安
