前言
学习Go语言,抓住未来的机遇
你好,我是飞雪无情,在技术领域从业近10年,目前在一家互联网公司担任副总裁,负责产品的研发管理和架构设计。
2014年,我因为Docker接触了Go语言,其简洁的语法、高效的开发效率和语言层面上的并发支持深深地吸引了我。经过不断学习和实践,我对Go语言有了更深入的了解,不久后,便带领团队转型Go语言开发,提升了团队开发效率和系统性能,降低了用人成本。
在带领团队转型Go语言的过程中,我不断地把自己学习Go语言的经验总结成文章,以方便大家利用碎片时间学习,于是“飞雪无情”公众号和知乎号就诞生了。现在,我已经发布了300多篇相关文章,在帮助数万名读者朋友有效学习Go语言的同时,还有幸拿到了知乎Go语言专题的最高赞。
为开发者需求而设计的Go语言
K8s、Docker、etcd这类耳熟能详的工具就是用Go语言开发的,而且很多大公司(如腾讯、字节跳动等)都在把原来的C/C++、Python、PHP技术栈迁往Go语言。
在我看来,Go语言备受推崇,与其本身的优势有直接的关系:
语法简洁,相比其他语言更容易上手,开发效率更高。
自带垃圾回收(GC)功能,不用手动申请释放内存,能够有效避免Bug,提高性能。
语言层面的并发支持让你能够很容易地开发出高性能程序。
提供强大的标准库,第三方库也足够丰富,可以拿来即用,提高开发效率。
可通过静态编译直接生成一个可执行文件,运行时不依赖其他库,部署方便,可伸缩能力强。
提供跨平台支持,很容易编译出跨各个系统平台直接运行的程序。
对比其他语言,Go的优势显著。比如Java虽然具备垃圾回收功能,但它是解释型语言,需要安装JVM才能运行;C语言虽然不用解释,可以直接编译运行,但是它不具备垃圾回收功能,需要开发者自己管理内存的申请和释放,容易出问题。而Go语言具备两者的优势。
如今微服务和云原生已经成为一种趋势,Go作为一门高性能的编译型语言,最适合承载微服务的落地实现,且容易生成跨平台的可执行文件,相比其他编程语言更容易部署在Docker容器中,实现灵活的自动伸缩服务。
总体来看,Go语言的整体设计理念就是以软件工程为目的,方便开发者更好地研发、管理软件项目,一切都是为开发者着想。
如果你是有1~3年经验的其他语言(如Python、PHP、C/C++)开发者,学习Go语言会比较容易,因为编程语言的很多概念是相通的。而如果你是有基本计算机知识但无开发经验的小白,也适合尽早学习Go语言,吃透它有助于加深你对编程语言的理解,也让你更有职业竞争力。
在与Go语言学习者进行交流和面试的过程中,我发现了一些典型问题,可概括为如下三点。
第一,学习者所学知识过于零碎,缺乏系统性,并且不是太深入,导致写不出高效的程序,也难以在面试中胜出。比如,我在面试时会问字符串拼接的效率问题,这个问题涉及加号(+)拼接、buffer拼接、builder拼接、并发安全等知识点,但应聘者通常只能答出最浅显的内容,缺乏对语言逻辑的深层思考。
第二,很多入门者已有其他语言基础,很难转换语言思维模式,尤其是在Go语言设计者还做了很多相对其他语言的改进和创新的情况下。作为从Java语言转到Go语言的过来人,我非常理解这种情况,比如对于错误的处理,Java语言使用Exception,Go语言则通过函数返回error,这会让人很不习惯。
第三,没有开源的、适合练手的项目。
在过去分享Go语言知识的过程中,我融入了应对上述问题的方法并得到好评,有读者称“你的文章给我拨云见日的感觉!”“通过你的文章我终于懂context的用法了!”……这些正向评价更坚定了我分享内容的信心。
于是在不断地思考、整理后,我希望编写一本更具系统性也更通俗易懂的Go语言入门和进阶书籍,以帮助学习者少走弯路,比其他人更快一步提升职业竞争力。
本书的亮点和设计思路
系统性设计:从基础知识、底层原理到实战,让你不仅可以学会使用这门语言,还能从该语言自身的逻辑、框架层面分析问题,并上手项目。这样当出现问题时,你可以不再盲目地搜索知识点。
案例实操:设计了很多便于运用知识点的代码示例,还特意站在学习者的视角,演示了一些容易出Bug的场景,帮你避雷;引入了很多生活化的场景,比如用“枪响后才能赛跑”的例子演示sync.Cond的使用,帮助你加深印象,缓解语言学习的枯燥感。
贴近实际:本书内容来源于众多学习者的反馈。笔者在与他们的不断交流中,总结了问题的共性,并有针对性地将其融入本书。
那么,我是怎么划分本书内容的呢?
作为初学者,不管你是否有编程经验,都需要先学习Go语言的基本语法。因此,我首先介绍Go语言的基本语法,然后,在此基础上介绍Go语言的核心特性——并发,这也是Go语言最自豪的功能。其基于协程的并发比我们平时使用的线程并发更轻量,可以随意地在一台普通的计算机上启动成百上千个协程,成本却非常低。
在你掌握了基本知识后,我会通过底层分析深入讲解原理。我会结合源码,并对比其他语言的同类知识,带你理解Go语言的设计思路和底层语言逻辑。
此时你可能还有一些疑惑,比如不知道如何将知识与实际工作结合起来,这就需要后面介绍的Go语言工程管理方面的知识了。最后,我会介绍Go语言最新的特性——泛型,以方便你进一步理解Go语言、简化代码和提升效率。
所以,我根据这个思路将本书划分成5个部分:
第一部分:快速入门Go语言。我挑选了变量、常量、基础数据类型、函数和方法、结构体和接口等知识点进行介绍。这部分内容相对简洁,但已经足够让你掌握Go语言的基本程序结构了。
第二部分:Go语言的高效并发。这部分主要介绍goroutine、channel、同步原语等知识,让你对Go语言层面的并发支持有更深入的理解,并且可以编写自己的Go语言并发程序。这部分有一章专门介绍常用的并发模式,可以拿来即用,以更好地控制并发。
第三部分:深入理解Go语言。这部分讲解Go语言底层原理和高级功能,比如slice的底层是怎样的、为什么这么高效等。这部分内容是我特意为初学者设计的,因为我在初学编程时也是只学习如何使用,而不想研究底层原理,导致在工作中遇到障碍后又不得不回头恶补这部分知识。总之,只有理解了底层原理,你才能更灵活地编写程序并高效地应对问题。
第四部分:Go语言工程管理。学习一门语言,不仅要掌握它本身的知识,还要掌握模块管理、性能优化等周边技能,因为这些技能可以帮助你更好地进行多人协作,提高开发效率,写出更高质量的代码。你可以在这部分学到如何测试Go语言代码以提高代码质量、如何做好性能优化、如何使用第三方库来提高自己项目的开发效率等。
第五部分:Go语言泛型。这是Go语言在1.18版本中新增的特性,也是大家期待已久的特性。在这部分中,我会带你学习Go语言泛型的使用,以及如何使用泛型来提高效率和简化代码。
作者寄语
我一直不厌其烦地跟团队小伙伴说,Go语言是一门现代编程语言,相比其他编程语言,它有更好的用户体验,因为它的目的就是让我们更专注于自己业务的实现,提高开发效率。与此同时,当下的云原生是一种趋势,Go语言非常适合部署在这种环境中,越早学习越有竞争力。
此外,我在上文中也反复强调了学习底层原理的重要性。编程语言有很多共通之处(比如概念、关键字、特性语法等),吃透后再学习其他编程语言会简单很多,原因就在于你理解了语言本身。所以在学习Go语言的过程中,我希望你多想多练,深入理解,融会贯通。
现在,跟我一起踏上Go语言学习之旅吧!