购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

前言

你好,我是白明(Tony Bai),欢迎你和我一起学习Go。

我现在是一名Go开发者、架构师,也是技术博客tonybai.com的博主和GopherChina大会的讲师。

2011年,一次偶然的机会让我接触到Go之父罗伯·派克(Rob Pike)授课时所使用的幻灯片。当时,我正经受C语言编程中内存管理、线程调度及跨平台运行等问题的折磨。而Go以其简洁的语法、内置的内存垃圾回收机制及对并发的支持吸引了我,让我对它“一见钟情”。

我是一个对编程语言非常“挑剔”的人,这跟我从事的工作有关。十多年来,我在电信领域从事高并发、高性能、大容量的网关类平台服务端的开发工作,这两年也有幸参与了智能网联汽车行业的相关工作。在寻找适合这些需求的编程语言的过程中,我研究过C++、Java、Ruby、Erlang、Haskell与Common Lisp,但它们都因各种原因未能满足生产环境的需求。

而且,如果你对我所在的行业有所了解,你可能会知道,我参与开发的系统对性能的要求极高。我也曾长期将C语言作为生产语言,同时使用Python开发了多种辅助工具。但是,C语言的生产效率不高,且存在诸多陷阱,而Python的开发效率虽然高,但性能不够出色。

难道就没有一门相对“完美”、符合我使用需求的编程语言吗?就在这时,Go来了。

自2011年起,即使是在Go还未发布Go 1.0稳定版本的时候,我就开始接触Go。我接触的第一个Go版本是release.r60,它仅仅比罗伯·派克在其Go课程里使用的版本稍新一些。彼时,Go仍有许多不足之处,尤其是垃圾回收延迟比较大,这成为将Go应用于生产环境的最大障碍。尽管如此,我依然紧跟Go的演化进程。

从Go 1.4版本开始,随着每个大版本的发布,我都撰文分析其中的主要变化,并持续完善这些文章至今,未来也将继续这一工作。Go项目的 1.5版本实现自举编译,以及 1.11版本解决包依赖管理问题后,Go逐渐走向成熟。这时,我开始尝试在生产环境中应用Go。从使用Go替代Python编写辅助工具到开发网关所需的网络协议,我发现Go都能很好地满足需求。

随着时间的推移,Go最终取代了C、Python,成为我的首要生产编程语言。我直接使用Go构建了多个生产系统,诸如短信网关、5G消息网关、MQTT网关及API网关等。

如果让我总结选择Go的理由,我可以提供以下3点,供读者参考。

第1点:对初学者足够简单和友好,方便快速上手。

业界公认, Go是一种非常简单的编程语言 。到底有多简单呢?2011年,作为C语言开发者,我开始学习Go,借助派克的教程,仅用一天时间便掌握了Go的全部语法,并在一周内编写出一些简单、实用且质量较高的小程序。

与那些逐渐添加复杂特性的编程语言不同,Go从一开始就保持简洁,并保持至今。自Go 1.0版本发布以来,除了泛型以外,新增的语言特性屈指可数。Go的设计者们似乎把主要精力放在打磨Go的实现、改进语言周边工具链,以及提升开发者体验上。因此, 即使作为静态编程语言,Go的入门难度已经与动态编程语言相当。

第2点:生产力与性能的有效结合。

尽管Go的简单性和友好性吸引了很多新手开发者,但要真正让开发者留在Go世界,Go还需体现出自己的核心竞争力—— Go是生产力与性能的最佳结合。

如果你熟悉静态编程语言 ,那么你刚好是Go最初的目标用户。Go创建的最初目标就是构建一种流行的、高性能的服务器编程语言,用以替代当时广泛使用的Java和C++。在这一方面,Go初步实现了这个目标。Go的性能在带有垃圾回收和运行时的编程语言中处于领先地位,与不带垃圾回收的静态编程语言(例如C/C++)相比,也没有数量级的差距。在各大基准测试网站上,在相同的资源消耗水平下,Go的表现优于Java。

如果你熟悉动态编程语言, 也完全不用担心。Go的许多早期采用者来自动态编程语言的开发者群体,包括那些使用Python、JavaScript、Ruby和PHP等的开发者。与动态编程语言相比,Go能够在保持生产力的同时,大幅提升性能。

第3点:使用快乐且前景广阔。

Go的目标是重新为开发者带来快乐。这种快乐源于Go在开发体验上的显著提升,相较于C/C++甚至是Java尤为明显。笼统地说,这种提升来自Go简洁的语法、得心应手的工具链、丰富且健壮的标准库,以及生产力与性能的完美结合、免除内存管理的心智负担、对并发设计的原生支持等。

当然,学习和使用Go不仅仅是为了自娱自乐,运用Go体现自身价值、赢得理想职位才是最终目标。如今,Go已经在各大编程语言排行榜中稳居前十,并在全球范围内——无论是国内还是国外,都得到广泛应用。随着对Go人才需求的增长,企业之间对熟练掌握这门编程语言的开发者的争夺也日益激烈。例如,在腾讯、字节跳动、滴滴等公司中,Go已经成为主力编程语言之一。

紧跟Go演进十多年的我,已经将Go的点点滴滴深深地烙印在大脑中。自2019年起,我还将每天阅读的Go社区的优秀技术资料整理成公开的Gopher日报,希望能够为Go在国内的推广贡献一份力量。

2021年,我 在极客时间开设了《Go语言第一课》专栏, 旨在将多年积累的Go知识与技能分享给初学者。该专栏一经推出便受到读者们的热烈欢迎,至今专栏订阅学习者已有数万人。并且,通过这几年读者的反馈,我也修正了一些对Go理解上的疏漏,使专栏内容更加准确可靠。

为了能够帮助更多有意愿学习Go的开发者,我与人民邮电出版社合作,在极客时间“打造讲师个人IP”策略的支持下,对专栏的内容进行了优化和扩展,最终成书出版。

相较在线发布的专栏文章, 本书补充了之前缺失的重要语法点(如指针、测试、泛型等),并对已有内容进行了精炼,同时更新至Go 1.24版本。

总的来说,本书系统地介绍了Go的各个方面。期望它能成为你学习Go的得力助手,助你掌握和应用这门富有魅力的编程语言。

本书特色

本书的特色可以归纳为以下几点。

路径完整:本书涵盖了Go入门所需的基础知识和概念,旨在帮助读者快速且全面地掌握Go。

高屋建瓴:在深入讲解前,先向读者介绍Go的设计哲学和编程思想,使读者从一开始就理解并认同这些核心概念。

保姆级讲解:本书内容以图文结合的方式呈现,讲解详细透彻,并配有大量示例代码,每个示例都经过精心设计,确保简洁明了,帮助读者更直观地理解和掌握重点与难点内容。

本书主要内容

本书共分为18章。

第1章为Go概览,旨在为读者揭开Go的面纱,深入探讨其发展历程、设计哲学和独特魅力。无论你是初学者,还是有一定基础的开发者,都应先阅读这一章,了解Go的来龙去脉,为后续学习奠定坚实基础,并对学习Go的动机有更清晰的认识。

第2章至第5章详细介绍了如何建立Go开发环境、编写第一个Go程序、理解Go的代码组织方式和依赖管理等基础内容。这些内容构成了Go开发的基石。即使你已有编程经验,也建议仔细阅读,以确保牢固掌握这些基础知识。

第6章至第18章系统地讲解了Go的各项语法特性,包括变量与类型、基本数据类型、常量、复合数据类型、指针类型、控制结构、函数、错误处理、方法、接口类型、并发编程、泛型和测试等内容。你可以根据自身需求,学习感兴趣的章节。

如果你是初学者,建议按章节顺序阅读;如果你已有编程语言基础,则可以先熟悉第6章至第18章的语法特性,在遇到问题时再返回对应章节以查阅细节。

总之,本书的编排遵循由浅入深、从概览到细节的原则,旨在通过合理的章节安排,帮助你掌握Go这门编程语言。

本书读者对象

本书面向以下对Go感兴趣并希望系统学习的读者。

Go初学者,希望通过循序渐进的方式掌握这门编程语言。

了解Go但缺乏系统学习的人员。

有一定开发经验的开发者,考虑转投Go阵营。

任何对Go感兴趣并希望增进认知的读者。

勘误与支持

鉴于本书内容丰富,加之作者水平有限,书中难免存在疏漏或错误。如果你发现了任何问题,或者有任何建议、疑问,可以通过以下方式与作者联系。

发送电子邮件至本书的勘误邮箱(bigwhite.cn@aliyun.com)。

在本书作者的博客(https://tonybai.com)或微信公众号(iamtonybai)上留言。

直接在本书配套源码仓库(https://github.com/bigwhite/goprimer)提交Issue。

我会尽快回复你的反馈,并根据你的意见做出相应的改进。感谢你的支持与理解!

致谢

在本书即将出版之际,我衷心感谢所有在我学习和实践Go的过程中给予我启发和帮助的人。

首先,感谢Go的创造者和整个Go开发团队,是你们的努力让如此优雅且强大的编程语言得以问世。同时,也要感谢Go社区中无数个人和组织的贡献,你们的不懈努力推动了Go生态系统的不断完善和发展。

我还要感谢极客时间原总编辑郭蕾,以及编辑贾静、朱倩倩和王冬青,没有你们的支持和信任,就不会有《Go语言第一课》专栏,这本书也就不可能出版。

感谢极客时间《Go语言第一课》专栏的读者们,你们积极的互动和提出的问题为专栏的内容提供了宝贵的反馈和改进的机会,也使得这本基于专栏扩展而成的图书质量得以显著提高。

衷心感谢人民邮电出版社的编辑团队,没有你们的帮助,这本书无法呈现在读者面前。

我要特别感谢我的家人,你们的鼓励和支持给了我坚持写作的动力。

最后,我要感谢你——本书的读者。愿这本书能成为你了解和学习Go的绝佳工具,带给你快乐与成就感。让我们共同领略Go的魅力,开启精彩的编程之旅!

白明 j0cLN9y2m+zBBo7ldICG3dT7wyJNtDu8lzW9CyMyzXhK/GqGORk9qhlSgi0V/59E

点击中间区域
呼出菜单
上一章
目录
下一章
×

打开