Go语言也称为Golang,它出自计算机科学领域的三位巨匠Ken Thompson、Rob Pikeh和Robert Griesemer之手,在2009年由Google公司正式发布。Go语言是一种静态强类型、编译型、并发型及具有垃圾回收功能的开源编程语言。它的主要目标是“兼具Python等动态语言的开发速度和C/C++等编译型语言的性能与安全性”。Go语言语法简单,规则严谨。此外,Go语言拥有功能完善、质量可靠的标准库,借助这些标准库,可以快速开发基础程序,极大降低学习与开发成本。Go语言拥有完整的工具链,编译、格式化、错误检查功能和帮助文档及第三方工具包都很完善,可以保证代码正确稳定的运行。正因为Go语言具有如此众多的特性,它被誉为“21世纪的编程语言”,成为一种国际化的新语言。
《Go语言入门经典/计算机科学与技术丛书》由知名IT开发者周家安编著,内容通俗易懂、理论全面、实例丰富。
Go(Golang)语言在语法上与C、C++语言相似,是一门开源的编程语言,可用于编写简单的、实用的应用程序。Go语言支持内存管理和垃圾回收(GC)机制,使用Go协程可以轻松实现并发计算。
《Go语言入门经典/计算机科学与技术丛书》通过通俗易懂的文字,着重讲解Go语言编程的基础知识,同时配有丰富的示例。
《Go语言入门经典/计算机科学与技术丛书》主要内容包括开发环境配置及语法基础,代码包(Package),内置运算符与数据类型,代码流程控制,函数式、接口与结构体,数组、切片与映射类型,反射技术,管理命令行参数,I/O、数据压缩及文件操作,加密与解密,网络编程,Go协程。
作为入门教程,《Go语言入门经典/计算机科学与技术丛书》适合对编程感兴趣并且希望通过自学来掌握Go语言基础知识的读者使用,或者有其他编程语言基础的读者阅读参考。
同时,《Go语言入门经典/计算机科学与技术丛书》也可作为高等院校计算机及相关专业的教材。
Go语言也称为 Golang,它出自计算机科学领域的三位巨匠Ken Thompson 和 Rob Pike、Robert Griesemer之手,在2009年由 Google 公司正式发布。Go语言是一种静态强类型、编译型、并发型及具有垃圾回收功能的开源编程语言。它的主要目标是“兼具Python等动态语言的开发速度和 C/C++等编译型语言的性能与安全性”。Go语言语法简单,规则严谨,具有并发模型、内存分配及垃圾回收机制。此外,Go语言拥有功能完善、质量可靠的标准库,借助这些标准库,可以快速开发基础程序,极大降低学习与开发成本。Go语言拥有完整的工具链,编译、格式化、错误检查功能和帮助文档及第三方工具包都很完善,可以保证代码正确稳定地运行。正因为Go语言具有如此众多的特性,它被誉为“21世纪的编程语言”,成为一种国际化的新语言。
本书由知名IT开发者周家安编著,图书通俗易懂、理论全面、实例丰富。涵盖了如下入门读者最为关心的基础知识:
开发环境配置;
语法基础;
代码包(Package);
内置运算符与数据类型;
代码流程控制;
函数式编程;
接口与结构体;
数组、切片与映射类型;
常用的字符串与数学函数;
反射技术;
管理命令行参数;
I/O与文件操作;
加密与解密;
数据压缩;
网络编程;
Go协程。
经过十多年的发展,Go语言日渐完善,它是一门开源的且支持跨平台的编程语言。与C、C++语言类似,Go语言也属于强类型语言,源代码需要编译后才能运行,因此拥有较优的性能。从小工具到Web服务器的开发,Go语言都能胜任。
Go语言有以下特点:
(1) 代码以包(Package)为单元,同一层目录下只能定义一个包名。
(2) 一个可执行程序有且只能有一个命名为main的包,main包中必须存在main函数。当程序运行时,会查找main函数,并从该函数开始执行; 当main函数执行完毕(或跳出该函数)后,可执行程序退出。
(3) 代码语句可以以“;”结尾,也可以省略。
(4) 左大括号(“{”)不能另起一行输入,必须与前面的内容同处一行。例如:
func test() {
……
}
(5) if、for等关键字之后不需要小括号(C、C++等语言需要小括号)。
(6) 字符串常量可以使用“`”来避免转义,例如:
`some content`
(7) 在函数(或方法)的调用语句中使用go关键字可以轻松完成异步编程。例如:
go test()
本书内容涵盖了Go语言的各个知识点。从语法基础、数据类型到较为复杂的反射技术、网络编程,均有阐述。每个知识点都配有丰富的代码示例,方便理解; 每一章的末尾附带思考题,可帮助读者回忆所学内容,加深印象。
编者希望通过本书帮助初学者快速了解Go语言,掌握最基本的编程方法和技术要点。阅读本书后,读者应该能够运用Go语言编写出一些像样的程序。
由于编者水平有限,书中难免出现不完善的地方,欢迎广大读者及同仁不吝赐教,共同进步。
编者
2020年6月
第1章准备工作
1.1安装Go语言编译器
1.2配置环境变量
1.3验证Go语言编译器的工作状态
第2章语法基础
2.1代码结构
2.2main包与main函数
2.3Go语句
2.4代码块
2.5注释
2.6使用Go语言编译器
第3章运算符
3.1操作数
3.2算术运算符
3.2.1四则运算符
3.2.2取余运算符
3.2.3如何实现指数运算
3.2.4自增与自减运算符
3.3比较运算符
3.4逻辑运算符
3.5位运算符
3.5.1按位与
3.5.2按位或
3.5.3取反
3.5.4位移
3.5.5按位异或
3.5.6清除标志位
3.6成员运算符
3.7取地址运算符
3.8复合运算符
3.9运算符的优先级
第4章程序包管理
4.1package语句
4.2程序包的目录结构
4.3导入语句
4.4初始化函数
4.5模块
4.5.1go.mod文件的基本结构
4.5.2创建go.mod文件
4.5.3编辑go.mod文件
4.5.4使用本地模块
4.6成员的可访问性
第5章变量与常量
5.1变量的初始化
5.2组合赋值
5.3匿名变量
5.4常量
5.5批量声明
5.6变量的作用域
5.7变量的默认值
第6章基础类型
6.1字符与字符串
6.1.1rune类型
6.1.2string类型
6.2数值类型
6.2.1示例: 获取数值类型占用的内存大小
6.2.2整数常量的表示方式
6.2.3科学记数法
6.2.4复数
6.3日期与时间
6.3.1Month类型
6.3.2Weekday类型
6.3.3Duration类型
6.3.4Time类型
6.3.5Sleep函数
6.3.6Timer类型
6.4指针
6.4.1何时使用指针类型
6.4.2new函数
6.5iota常量
第7章函数
7.1函数的定义
7.2调用函数
7.3return语句
7.4多个返回值
7.5可变个数的参数
7.6匿名函数
7.7将函数作为参数传递
第8章流程控制
8.1顺序执行
8.2if语句
8.3switch语句
8.3.1基于表达式构建的switch语句
8.3.2基于类型构建的switch语句
8.3.3fallthrough语句
8.4for语句
8.4.1仅带条件子句的for语句
8.4.2带三个子句的for语句
8.4.3枚举集合元素语句
8.4.4continue与break语句
8.5代码跳转
8.5.1代码标签与goto语句
8.5.2break、continue语句与代码跳转
第9章接口与结构体
9.1自定义类型
9.2结构体
9.2.1结构体的定义
9.2.2结构体的实例化
9.2.3方法
9.3接口
9.3.1接口的定义
9.3.2接口的实现
9.3.3空接口——interface{}
9.3.4接口与函数
9.4类型嵌套
9.5类型断言
第10章数组与切片
10.1数组
10.1.1数组的初始化
10.1.2访问数组元素
10.1.3*[n]T与[n]*T的区别
10.1.4多维数组
10.2切片
10.2.1创建切片实例
10.2.2添加和删除元素
第11章映射与链表
11.1映射
11.1.1映射对象的初始化
11.1.2访问映射对象的元素
11.1.3检查key的存在性
11.2双向链表
11.2.1与双向链表有关的API
11.2.2创建链表实例
11.2.3添加和删除元素
11.2.4移动元素
11.2.5枚举链表元素
11.3环形链表
11.3.1与环形链表有关的API
11.3.2使用环形链表
11.3.3滚动环形链表
11.3.4链接两个环形链表
第12章反射
12.1关键API
12.2获取类型信息
12.2.1类型分辨
12.2.2枚举结构体类型的方法列表
12.2.3枚举结构体类型的字段列表
12.2.4查找嵌套结构体的字段成员
12.2.5获取函数的参数信息
12.2.6获取通道类型的信息
12.2.7判断类型是否实现了某个接口
12.3Value与对象的值
12.3.1修改对象的值
12.3.2读写结构体实例的字段
12.3.3更新数组/切片的元素
12.3.4调用函数
12.3.5调用方法
12.3.6读写映射类型的元素
12.4动态构建类型
12.4.1New函数
12.4.2创建数组类型
12.4.3创建结构体类型
12.4.4动态创建和调用函数
12.4.5生成通用函数体
12.5结构体的Tag
第13章字符串处理
13.1打印文本
13.2格式化输出
13.2.1格式化整数值
13.2.2格式化浮点数值
13.2.3格式化字符串
13.2.4格式化布尔类型的值
13.2.5%T与%v格式控制符
13.2.6输出包含前缀的整数值
13.2.7设置输出内容的宽度
13.2.8控制浮点数的精度
13.2.9参数索引
13.2.10通过参数来控制文本的宽度和精度
13.3读取输入文本
13.3.1读取键盘输入的内容
13.3.2从文件中读入文本
13.3.3以特定的格式读取文本
13.4实现Stringer接口
13.5连接字符串
13.6替换字符串
13.7拆分字符串
13.8查找子字符串
13.8.1查找前缀与后缀
13.8.2查找子字符串的位置
13.9修剪字符串
13.9.1去除前缀和后缀
13.9.2去除字符串首尾的空格
13.9.3修剪指定的字符
13.10重复字符串
13.11字符串与数值之间的转换
13.12切换大小写
13.13使用Builder构建字符串
第14章常用数学函数
14.1求绝对值
14.2最大值与最小值
14.3三角函数与反三角函数
14.4幂运算
14.5开平方/立方根
14.6大型数值
14.6.1大型整数值之间的运算
14.6.2阶乘运算
14.6.3使用大型浮点数值
14.7随机数
14.7.1生成随机浮点数
14.7.2生成随机整数
14.7.3设置随机数种子
14.7.4生成随机全排列
14.7.5“洗牌”程序
14.7.6生成随机字节序列
第15章排序
15.1基本排序函数
15.2实现递减排序
15.3按字符串的长度排序
15.4Interface接口
第16章输入与输出
16.1简单的内存缓冲区
16.2与输入/输出有关的接口类型
16.2.1实现读写功能
16.2.2嵌套封装
16.3Buffer类型
16.4Copy函数
16.5MultiReader函数和MultiWriter函数
16.6SectionReader
第17章文件与目录
17.1文件操作
17.1.1Create函数与Open函数
17.1.2重命名文件
17.1.3获取文件信息
17.1.4OpenFile函数
17.2创建和删除目录
17.3硬链接与符号链接
17.3.1硬链接
17.3.2符号链接
17.4WriteFile函数与ReadFile函数
17.5临时文件
17.6更改程序的工作目录
第18章加密与解密
18.1Base64的编码与解码
18.1.1内置Base64编码方案
18.1.2基于流的编码与解码
18.1.3自定义字符映射表
18.2DES与AES算法
18.2.1Block接口
18.2.2BlockMode模式
18.2.3基于流的加密与解密
18.3哈希算法
18.3.1hash.Hash接口
18.3.2使用crypto子包中的哈希API
18.3.3HMAC算法
18.4RSA算法
18.4.1生成密钥
18.4.2加密和解密
18.4.3存储密钥
18.5PEM编码
18.5.1编码与解码
18.5.2解码后的保留数据
18.5.3消息头
第19章命令行参数
19.1os.Args变量
19.2命令行参数分析API——flag包
19.2.1命令行参数与变量的绑定
19.2.2Value接口
第20章数据压缩
20.1标准库对压缩算法的支持
20.2Gzip压缩算法
20.2.1Gzip基本用法
20.2.2压缩多个文件
20.2.3解压多个文件
20.3DEFLATE算法
20.4自定义的索引字典
20.5Zip文档
20.5.1从Zip文档中读取文件
20.5.2在内存中读写Zip文档
20.5.3注册压缩算法
20.6Tar文档
第21章协程
21.1启动Go协程
21.2通道
21.2.1实例化通道
21.2.2数据缓冲
21.2.3单向通道
21.2.4通道与select语句
21.3互斥锁
21.4WaitGroup类型
第22章网络编程
22.1枚举本地计算机上的网络接口
22.2Socket通信
22.2.1TCP示例: 文件传输
22.2.2UDP示例: 文本传输
22.3HTTP客户端
22.3.1发送GET与POST请求
22.3.2发送自定义HTTP头
22.4HTTP服务器
22.4.1创建HTTP服务器
22.4.2实现Handler接口
22.4.3ServeMux类型
22.4.4封装函数
22.4.5读取URL参数
22.4.6获取客户端提交的表单数据
22.4.7读取客户端上传的文件
22.5CGI编程
22.5.1准备工作
22.5.2示例: 一个简单的CGI程序
22.5.3使用cgi包
22.5.4在子进程中获取Request对象
附录A常用API与程序包对照表
附录BGo语言代码编辑工具使用说明