市面上Go语言编程类图书有很多,本书和其他Go语言编程类图书有什么区别?这是每一个读者最关心的问题,也是笔者写本书前最关心的问题,本书能给读者带来什么价值?笔者发现市面上缺少一本系统性介绍Go语言核心语言特性和语言陷阱的书,这两点就是本书的主题。Go语言的核心语言特性包括:类型系统、接口、并发。这三部分是Go语言最精华、最优美、也是最重要的特征,本书紧密围绕这三个主题展开。以“类型系统”为例,Go语言中的类型有:简单类型、复合类型、命名类型、未命名类型、静态类型、动态类型、底层类型、接口类型、具体类型以及类型字面量等诸多概念,这些概念在其他Go类图书里面鲜有介绍,本书试图帮助读者梳理清楚这些类型的含义,建立概念,认清类型本质并学会正确使用;在接口章节,不单介绍了接口概念和用法,还深入分析了接口的机制,使读者对Go语言非侵入式的接口有更深入的理解;在并发编程章节,书中给出了5个并发编程范式,并用图描述并发程序的模型,通俗易懂,这也是本书特有的。此外本书还拿出一整章内容介绍Go语言编程过程中可能遇到的陷阱,不仅告诉读者陷阱是什么,正确使用方式是什么,同时也给出出现这种问题的根本原因,使读者后续能够避免犯同样的错误。本书最后从哲学角度论述下Go语言的编程思想,相信Go语言爱好者一定可以从书中找到自己感兴趣内容。
本书围绕三大的主题展开:
1. Go语言精华部分 ——并发和小而美的类型系统;
2. Go陷阱——这些主要论述使用Go过程中大家很困惑或者容易出错的地方;
3. Go语言的哲学——总结Go的设计哲学,懂得Go作者的设计意图,才能更好地使用该语言。
写作背景
2007年,Go语言诞生于谷歌公司,2009年开源,2012年推出1.0版本,曾两次获得TIOBE年度语言(2009年和2016年)。2012年起,全球大量的开源项目开始使用Go语言进行开发,目前Go语言已经成为云计算领域事实上的标准语言,特别是在容器领域,诞生了一大批优秀的开源软件,如Docker、Kubernetes 等。2017年区块链技术在国内大热,区块链两个大的技术平台以太坊(Ethereum)和超级账本(Hyperledger)与项目Fabric都是基于Go语言构建的。Go语言的应用领域逐步扩大,目前在区块链、云计算、中间件和服务器编程领域显现出明显的优势。Go语言最先在云计算公司盛行,随后大量的互联网初创企业将Go语言作为后台主要开发语言。目前,无论互联网公司里的独角兽,还是BAT(百度、阿里巴巴、腾讯),都已将Go语言作为其技术栈的重要组成部分。市场对于Go语言编程人才的需求量也在持续上升。
目前,Go语言编程类图书有如下几个类别。
基础全面型
七牛团队写作和翻译的几本书(《Go 语言编程》《Go 程序设计语言》等),系统地介绍了Go 开发的基础知识,为Go 语言在国内的推广做出了很大的贡献。
源码深入型
雨痕的《Go 语言学习笔记》,上半部分是对 Go 语言基础知识的总结,下半部分对源码进行了分析,是学习Go语言内部原理非常好的参考书。
专业领域型
专注于介绍某个应用领域,比如谢孟军的《Go Web编程》,这类图书主要是介绍使用Go语言在某个领域进行开发的相关知识。
市面上Go语言的图书这么多了,为什么又要写一本,本书和市面上的图书有什么区别呢?这也是我写这本书之前就认真思考过的问题。我发现市面上缺少介绍Go语言核心特性和使用陷阱的书。Go 语言核心特性包括类型系统、接口、并发,这三部分是Go语言最精华、最优美、最重要的语言特性。于是我就围绕这三个主题写了本书,书名就叫《Go语言核心编程》。以类型系统为例,Go 语言中的类型涉及简单类型、复合类型、命名类型、未命名类型、静态类型、动态类型、底层类型、接口类型、具体类型及类型字面量等诸多概念,这些在先前的书籍里没有系统地介绍过,本书试图帮助读者梳理清楚这些类型的含义,建立概念,认清类型本质并学会使用;在并发编程中给出了5个并发编程范式并系统地介绍了context标准库,这也是本书特有的。
内容简介
本书共9章,围绕如下主题展开:基础知识(第1章)、语言核心(第2章~第7章)、工程管理(第8章)和编程哲学(第9章)。
基础知识
第1章介绍Go语言编程的基础知识。基础知识部分力求从系统性的角度讲述Go语言简洁的语法知识,试图帮助读者了解Go语言源程序基本结构,这是本书不同于其他书籍的地方。本章先对Go的源程序进行整体介绍,然后从词法分析的角度介绍Go语言的各个token,接着介绍Go语言的基础语法:变量和常量、数据类型及控制结构,让读者学习Go语言的语法知识时可以“既见树木,又见森林”。
语言核心
本书的第2~7章讲解Go语言核心知识,这部分是本书最核心、最重要的部分,主要围绕如下4个主题展开。
类型系统
本书用3章的篇幅来讲解Go语言的类型系统,分别是第2章函数、第3章类型系统和第4章接口。类型系统是Go语言的灵魂,Go语言小而美的类型系统是其区别于其他语言的显著特征。函数在Go语言中是“一等公民”,非侵入式的接口设计也很有特点。类型系统是本书的一条主要线索,几乎贯穿本书的所有章节,在反射章节里会对Go的类型系统做一个总结。掌握类型系统是写好Go程序的关键。
并发编程
第5章介绍Go并发编程,并发编程的原生支持是Go语言显著的语言特征。“不要通过共享内存来通信,而是通过通信来共享内存”,本章首先讲解语言层面对并发的支持,接着讲解context标准库的知识,最后讲解常用的并发范式和Go并发模型。
反射
第6章介绍Go语言反射的相关知识。反射是Go语言的高级特性,反射是把“双刃剑”,用好了会有强大的威力,但由于其复杂性且易产生运行时panic,因此反射又表现出脆弱性。Go语言没有提供泛型支持,所以在开发框架和大型系统中反射是必须面对的一个技术点,市面上的图书对这部分的介绍不多,本书分类总结了Go的反射API,尽可能梳理出条理清晰的API结构;同时以类型系统和接口底层实现为基础来介绍反射;最后介绍著名的Web框架martini中使用的依赖注入库inject。
陷阱和习惯用法
第7章介绍Go语言陷阱和一些习惯用法,包括Go语言使用过程中容易出错和初学者容易困惑的知识点。Go语言虽然设计简洁,但在某些方面还是有瑕疵的,比如 defer陷阱、短变量的声明、range临时变量共享等。同时Go又有其鲜明的书写格式和习惯用法,本章的最后会介绍这些内容。
工程管理
Go语言是一门面向工程的语言,而不是学术界的产物,第8章介绍Go语言工程管理方面的知识,主要介绍Go的编程环境、命名空间和包管理的相关内容。
编程哲学
第9章讨论编程哲学,这部分内容不是介绍编程细节知识,读者可以把它当作散文来读。先对Go语言编程哲学做一个总结:少即是多,世界是并行的,组合优于继承,面向接口编程,等等,试图从哲学的角度来阐述这些设计思想的先进性。最后介绍Go语言的里程碑事件及未来的发展方向。
相关约定
本书使用Go代表Go语言的简写,使用go表示Go语言的并发关键字,使用goroutine代表Go语言中的并发执行体。通道和chan都代表Go语言的通信管道。切片和slice都表示Go语言内置的可变数组。本书使用实例或者类型实例表示具体类型的变量,而没有使用传统语言对象的概念。标准库和标准包会混用,都是指Go语言自带的标准库。复制和拷贝具有相同的语义,都表示将数据复制一份并拷贝到另一处内存空间。本书是基于Go 1.10.2写作的,新版本的变动请读者以官方文档为准。截至本书出版时,Go 1.11发布,官方推出了新的包管理工具go mod,go mode兼容dep,dep仍可放心使用,go mod是新增的功能,可能需要一段时间才能成熟。
总结
本书绝大部分内容是我六年来在学习和实践Go语言过程中的总结和感悟,成书过程中也参阅了部分网上和官方资料,由于能力有限,疏忽和不足之处难免发生,欢迎读者指正,以便及时修订,我的邮箱是email.tata@qq.com。
感谢
本书原稿基于GitBook+Markdown在Linux下使用Vim完成写作,原始稿件版式简单,非常感谢电子工业出版社博文视点编辑部的帮助,使其变成一本优美的纸质书。非常感谢曾刘刚通读全书,帮助审稿;同时感谢宫振飞、胡宸源、宋磊在成书过程中给予的宝贵意见。在时间碎片化的今天,一字一句地写完一本书是对自己毅力和耐心的极大考验,感谢在成书过程中妻子黄静给予的鼓励和支持。封面上可爱的地鼠来自上田拓也的作品,非常感谢上田先生欣然授权本书使用。
李文塔
内置函数中Print和Printin以小写字母开头
Print,Printin==》print,println
整型中 unint8 应改为uint8
赋值复核运算符应改为复合赋值运算符
b := image(v)错误, 应该为 b := imag(v)