```go
├─第1天视频
│ └─第一天视频
│ 01_课程安排
│ 02_go介绍
│ 03_环境搭建
│ 04_帮助文档的使用
│ 05_第一个go程序
│ 06_命令行运行程序
│ 07_数据类型作用和命名规范
│ 08_变量的声明
│ 09_变量初始化和自动推导类型
│ 10_自动推导类型和赋值区别
│ 11_Printf和Println的区别
│ 12_多重赋值和匿名变量
│ 13_常量的使用
│ 14_多个变量或变量的定义
│ 15_iota枚举
│ 16_类型的分类
│ 17_bool类型
│ 18_浮点型
│ 19_字符类型
│ 20_字符串类型
│ 21_字符和字符串的区别
│ 22_复数类型
│ 23_格式化输出
│ 24_变量的输入
│ 25_类型转换
│ 26_类型别名
│ 27_运算符(上)
│ 28_运算符(下)
│ 29_if的使用
│ 30_if支持初始化语句
│ 31_if_elseif_else的使用
│ 32_switch的使用
│ 33_switch使用的补充
│ 34_for循环的使用
│ 35_range的使用
│ 36_break和continue的区别
│ 37_goto的使用
│
├─第2天视频
│ └─第2天视频
│ 01_昨日回顾
│ 02_无参无返回值函数的使用
│ 03_有参无返回值函数:普通参数列表
│ 04_不定参数类型
│ 05_不定参数的传递
│ 06_有参无返回值函数使用的总结
│ 07_函数只有一个返回值
│ 08_函数有多个返回值
│ 09_函数定义格式总结
│ 10_有参有返回值函数的使用
│ 11_普通函数的调用流程
│ 12_递归函数的调用流程
│ 13_通过递归实现的累加
│ 14_函数类型
│ 15_回调函数
│ 16_匿名函数基本语法
│ 17_闭包捕获外部变量特点
│ 18_闭包的特点
│ 19_defer的使用
│ 20_多个defer的执行顺序
│ 21_defer和匿名函数结合使用
│ 22_获取命令行参数
│ 23_局部变量特点
│ 24_全局变量
│ 25_不同作用域的同名变量
│ 26_工作区介绍
│ 27_导入包的使用
│ 28_工程管理:同级目录
│ 29_工程管理:不同目录
│ 30_init函数的介绍
│ 31_go_intall命令的使用
│
├─第3天视频
│ └─第3天视频
│ 01_昨日回顾
│ 02_变量的内存和变量的地址
│ 03_指针变量的基本使用
│ 04_不要操作没有合法指向的内存
│ 05_new函数的使用
│ 06_值传递
│ 07_地址传递
│ 08_为什么需要数组
│ 09_数组的基本操作
│ 10_数组初始化
│ 11_二维数组的介绍
│ 12_数组比较和赋值
│ 13_随机数的使用
│ 14_冒泡排序原理
│ 15_冒泡排序代码实现
│ 16_数组做函数参数是值拷贝
│ 17_数组指针做函数参数
│ 18_切片介绍
│ 19_数组和切片区别
│ 20_切片的创建
│ 21_切片截取
│ 22_切片和底层数组关系
│ 23_append函数的使用
│ 24_append扩容特点
│ 25_copy的使用
│ 26_切片做函数参数
│ 27_猜数字:产生一个随机的4位数
│ 28_猜数字:取出每一位数
│ 29_猜数字:输入一个4位数并取出每一位
│ 30_猜数字:逻辑处理
│ 31_map介绍
│ 32_map的基本操作
│ 33_map赋值
│ 34_map遍历
│ 35_map删除
│ 36_map做函数参数
│ 37_结构体普通变量初始化
│ 38_结构体指针变量初始化
│ 39_结构体成员的使用:普通变量
│ 40_结构体成员的使用:指针变量
│ 41_结构体比较和赋值
│ 42_结构体做函数参数:值传递
│ 43_结构体做函数参数:地址传递
│ 44_go语言可见性规则验证
│
├─第4天视频
│ └─第4天视频
│ 01_昨日回顾
│ 02_面向对象编程
│ 03_匿名字段作用
│ 04_匿名字段初始化
│ 05_成员操作
│ 06_同名字段
│ 07_非结构体匿名字段
│ 08_结构体指针类型匿名字段
│ 09_方法介绍
│ 10_面向过程和面向对象函数区别
│ 11_结构体类型添加方法
│ 12_方法使用总结
│ 13_值语义和引用语义
│ 14_指针类型和普通类型的方法集
│ 15_方法的继承
│ 16_方法的重写
│ 17_方法值
│ 18_方法表达式
│ 19_接口类型介绍
│ 20_接口的定义和实现
│ 21_多态的表现
│ 22_接口继承
│ 23_接口转换
│ 24_空接口
│ 25_通过if实现类型断言
│ 26_通过switch实现类型断言
│
├─第5天视频
│ └─3-视频
│ 01_昨日回顾
│ 02_error接口的使用
│ 03_error接口的应用
│ 04_显式调用panic函数
│ 05_数组越界导致panic
│ 06_recover的使用
│ 07_字符串操作常用函数介绍
│ 08_字符串操作代码验证
│ 09_字符串转换
│ 10_正则表达式(上)
│ 11_正则表达式(中)
│ 12_正则表达式(下)
│ 13_json介绍
│ 14_通过结构体生成json
│ 15_struct_tag的使用
│ 15_通过map生成json
│ 16_json解析到结构体
│ 17_json解析到map
│ 18_文件分类和为什么需要文件
│ 19_文件常用操作接口介绍
│ 20_标准设备文件的使用
│ 21_WriteString的使用
│ 22_Read的使用
│ 23_借助bufio实现按行读取内容
│ 24_文件案例:拷贝文件
│
├─第6天视频
│ └─3-视频
│ 01_昨日回顾
│ 02_并行和并发的区别
│ 03_go语言并发优势
│ 04_创建goroutine
│ 05_主协程先退出
│ 06_主协程先退出导致子协程没来得及调用
│ 07_runtime.Gosched的使用
│ 08_runtime.Goexit的使用
│ 09_runtime.GOMAXPROCS的使用
│ 10_多任务资源竞争问题
│ 11_channel介绍
│ 12_通过channel实现同步
│ 13_通过channel实现同步和数据交互
│ 14_无缓冲channel
│ 15_有缓冲channel
│ 16_关闭channel
│ 17_通过range遍历channel内容
│ 18_单向channel特点
│ 19_单向channel的应用
│ 20_Timer的使用
│ 21_Timer实现延时功能
│ 22_定时器停止
│ 23_定时器重置
│ 24_Ticker的使用
│ 25_select的作用
│ 26_通过select实现斐波那契数列
│ 27_通过select实现斐波那契数列(画图)
│ 28_select实现的超时机制
│
├─第7天视频
│ └─3-视频
│ 01_昨日回顾
│ 02_网络协议介绍
│ 03_分层模型介绍
│ 04_层和协议
│ 05_mac地址介绍
│ 06_网络层的作用
│ 07_传输层作用
│ 08_应用层功能
│ 10_网络通信条件
│ 11_通信过程如何组包和拆包
│ 12_socket简单介绍
│ 13_cs模型介绍
│ 14_TCP服务器代码编写
│ 15_netcat工具的使用
│ 16_TCP客户端代码编写
│ 17_简单版并发服务器
│ 18_客户端即可输入也可接收服务器回复
│ 19_文件传输原理分析
│ 20_os.Stat的使用
│ 21_传输文件:发送方
│ 22_传输文件:接收方
│ 23_传输文件功能验证
│ 24_并发聊天服务器功能演示
│ 25_并发聊天服务器原理分析
│ 26_并发聊天服务器:广播上线
│ 27_并发聊天服务器:广播消息
│ 28_并发聊天服务器:查询在线用户
│ 29_并发聊天服务器:修改用户名
│ 30_并发聊天服务器:用户主动退出
│ 31_并发聊天服务器:超时处理
│
└─第8天视频
└─3-视频
01_昨日回顾
02_web工作流程
03_http协议和url介绍
03_请求包和响应包简单介绍
04_请求报文格式分析
05_服务器如何知道用户需要什么资源
06_响应报文测试方法
07_响应报文格式分析
08_http编程介绍
09_http服务器编程
10_http服务器获取客户端的一些信息
11_http客户端编程
12_百度贴吧小爬虫
13_百度贴吧小爬虫总结
14_并发版网络爬虫
15_段子爬虫:明确目标
16_段子爬虫:爬主页面有用链接
17_段子爬虫:爬取段子页面
18_段子爬虫:把内容存储到文件中
19_段子爬虫:并发爬虫
链接: https://pan.baidu.com/s/1eA5JUGwsqAfYWt5yOQ0TdQ
密码: htc7
```