目录 第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定时任务