目录
第1章编程的前世今生
1.1编程语言发展史
1.2编程语言时间轴
1.3Go语言发展史
1.3.1Go语言是如何诞生的
1.3.2Go语言的早期团队和演进历程
1.3.3Go语言正式发布并开源
1.4Go语言特点
1.4.1编译型语言和解释型语言
1.4.2Go语言为并发而生
1.4.3Go语言设计理念
1.4.4使用Go语言的项目
1.5学好Go语言的建议
第2章环境搭建(8min)
2.1在Windows系统下搭建Go开发环境
2.1.1SDK简介
2.1.2下载SDK工具包
2.1.3配置Go环境变量
2.1.4检查Go语言环境是否安装成功
2.2Linux系统下搭建Go语言开发环境
2.2.1Linux系统下安装SDK
2.2.2配置Go环境变量
2.3macOS系统下搭建Go语言开发环境
2.4Go语言的开发工具介绍
2.4.1工具介绍
2.4.2工具选择
2.4.3VS Code的安装和使用
2.4.4GoLand的安装和使用
2.5运行第1个程序
2.5.1Go代码结构介绍
2.5.2GoLand中运行Go文件
2.5.3命令行运行Go文件
第3章变量与基本数据类型(46min)
3.1什么是变量
3.2变量的声明、初始化和赋值
3.3常量
3.4局部变量和全局变量
3.5变量可见性
3.6注释
3.6.1注释的格式
3.6.2包注释
3.6.3命令注释
3.6.4变量注释
3.7规范的代码风格
3.8数据类型的基本介绍
3.8.1数字类型
3.8.2浮点数类型
3.8.3字符串类型
3.8.4布尔类型
3.8.5字符类型
3.9扩展——字符编码
3.9.1ASCII第1个编码集合的诞生及发展
3.9.2GBK编码的诞生及发展
3.9.3Unicode编码的诞生
3.9.4UTF系列编码的诞生及发展
3.9.5扩展——乱码之王锟斤拷
3.10基本数据类型的默认值
3.11类型转换
3.11.1显式类型转换
3.11.2隐式类型转换
3.11.3strconv包
3.12输入函数
3.12.1Scanf函数
3.12.2Scanln函数
3.12.3Scan函数
第4章运算符(3min)
4.1运算符基本介绍
4.2赋值运算符
4.3算术运算符
4.4关系运算符
4.5逻辑运算符
4.6位运算符
4.6.1按位与
4.6.2按位或
4.6.3按位异或
4.6.4按位左移
4.6.5按位右移
4.7运算符的优先级
第5章流程控制(26min)
5.1条件判断
5.1.1if单分支
5.1.2ifelse双分支
5.1.3ifelseif多分支
5.1.4if嵌套
5.1.5知识扩展——卫语句
5.2switch语句
5.3循环语句
5.3.1标准for循环
5.3.2while模式的for循环
5.3.3dowhile模式的for循环
5.3.4for range模式的for循环
5.3.5break语句
5.3.6continue语句
5.3.7多重循环
第6章数组、切片、Map(27min)
6.1数组
6.1.1声明数组
6.1.2初始化数组
6.1.3数组索引
6.1.4修改数组元素
6.1.5遍历数组
6.2切片
6.2.1什么是切片
6.2.2切片的创建和初始化
6.2.3nil和空切片
6.2.4为切片中的元素赋值
6.2.5通过切片创建新的切片
6.2.6遍历切片
6.2.7append()函数
6.2.8切片的底层原理
6.3map
6.3.1map的声明与初始化
6.3.2map的增、删、改、查
6.3.3map的底层实现
第7章函数与指针(50min)
7.1函数
7.1.1函数定义
7.1.2函数参数
7.1.3函数返回值
7.1.4匿名函数
7.1.5函数可作为参数
7.1.6函数可作为返回值
7.1.7函数作为变量
7.2特殊的函数
7.2.1main()函数
7.2.2init()函数
7.2.3defer()函数
7.2.4递归函数
7.3指针
7.3.1指针地址和指针类型
7.3.2指针取值
7.3.3空指针
7.3.4new
7.3.5make
第8章结构体与自定义数据类型(29min)
8.1结构体
8.1.1结构体定义
8.1.2结构体实例化
8.1.3结构体方法
8.1.4结构体匿名字段
8.1.5嵌套结构体
8.1.6结构体的“继承”
8.1.7结构体标签
8.1.8结构体内存布局
8.2自定义数据类型与类型别名
8.2.1自定义类型
8.2.2自定义类型方法
8.2.3类型别名
8.2.4自定义类型和类型别名的区别
第9章接口(16min)
9.1Go接口interface
9.1.1接口的定义
9.1.2接口的实现
9.1.3接口的使用
9.1.4接口嵌套
9.1.5类型断言
9.2空接口
第10章协程与Channel(27min)
10.1何为协程
10.1.1WaitGroup
10.1.2WaitGroup原理探析
10.2Channel信道
10.2.1Channel类型
10.2.2创建Channel
10.2.3操作Channel
10.2.4无缓冲的Channel
10.2.5有缓冲的Channel
10.2.6从Channel中循环取值
10.3select
10.3.1select特点
10.3.2带default的语句
10.3.3不带default的语句
10.3.4关闭Channel监听
10.3.5空的select将一直阻塞
10.3.6select定时器
10.4协程的设计与原理
10.4.1单进程时代
10.4.2多进程时代
10.4.3多线程时代
10.4.4协程时代
10.4.5协程的调度
10.4.6Go语言协程调度
第11章线程安全与异常处理(25min)
11.1线程为什么不安全
11.2如何解决线程安全问题
11.2.1互斥锁
11.2.2读写锁
11.2.3一次性锁
11.2.4sync.Pool
11.3线程安全sync.Map
11.3.1sync.Map基本用法
11.3.2sync.Map为什么快
11.4异常处理
11.4.1自定义错误
11.4.2错误的处理方式
第12章泛型(7min)
12.1泛型函数
12.1.1泛型约束
12.1.2指定底层类型
12.1.3可比较类型
12.1.4多参数泛型
12.1.5泛型嵌套
12.1.6常用泛型函数
12.2泛型结构体
12.3泛型切片
12.4泛型map
12.5泛型Channel
第13章文件操作(53min)
13.1相对路径与绝对路径
13.2文件读取
13.2.1一次性读取
13.2.2分片读取
13.2.3按行读取
13.3文件写入
13.3.1一次性写入
13.3.2逐行写入
13.3.3使用缓冲写入
13.3.4os.OpenFile()函数
13.4目录操作
13.4.1创建目录
13.4.2读取目录
13.4.3遍历目录
13.4.4目录的其他操作
13.5JSON文件操作
13.5.1JSON序列化
13.5.2JSON反序列化
13.6I/O接口
13.6.1io.Reader接口
13.6.2io.Writer接口
13.6.3io.Closer接口
13.6.4统一的抽象层
13.6.5最小接口原则
13.7命令行参数
13.7.1什么是命令行参数
13.7.2使用os.Args获取命令行参数
13.7.3使用flag包解析命令行参数
第14章单元测试与包管理
14.1最简单的测试
14.2单元测试的基本规范
14.3单元测试的常用方法
14.3.1表驱动测试
14.3.2随机执行
14.3.3子测试
14.3.4TestMain()函数
14.4基准测试
14.5包管理
14.5.1Go包的概念
14.5.2包的导入与可见性
14.5.3Go依赖管理的概念
14.5.4go mod的使用
第15章反射(13min)
15.1反射的优点与缺点
15.2reflect包
15.2.1type Type 类型
15.2.2type Kind类型
15.2.3TypeOf常用方法
15.2.4ValueOf常用方法
第16章网络编程(8min)
16.1HTTP编程
16.1.1HTTP服务器端
16.1.2HTTP客户端
16.2HTTP协议
16.2.1HTTP协议的发展历程
16.2.2HTTP协议会话方式
16.2.3请求报文
16.2.4响应报文
16.3TCP编程
16.3.1标准收发模式
16.3.2聊天收发模式
16.4TCP协议
16.4.1OSI七层模型
16.4.2TCP报文
16.4.3三次握手
16.4.4四次挥手
16.5UDP编程
16.5.1UDP优势
16.5.2UDP服务器端
16.5.3UDP客户端
16.5.4UDP应用场景
第17章部署(13min)
17.1打包命令
17.2交叉编译
17.3文件嵌入
17.3.1嵌入单个文件
17.3.2嵌入多个文件
17.3.3嵌入目录
第18章正则表达式
18.1正则表达式概述
18.2正则表达式基本语法
18.2.1字符集合
18.2.2字符范围
18.2.3数量字符
18.2.4元字符
18.2.5特殊字符
18.2.6位置匹配
18.2.7分组
18.2.8修饰符
18.3Go语言中使用正则表达式
18.3.1字符串匹配
18.3.2分组匹配
18.3.3分组替换
18.3.4标志
18.4常用正则表达式
第19章标准库和常用第三方库(43min)
19.1Go标准库
19.1.1时间和日期
19.1.2数学
19.1.3日志
19.1.4上下文
19.2Go常用第三方库
19.2.1logrus日志库
19.2.2gin
19.2.3定时任务