-
语言进阶\
-
并发和并行\
-
并发\
- 多个任务在一个核的cpu运行\
- 通过时间片\
-
并行\
- 多个任务在多个核的cpu运行\
-
-
goroutine\
-
线程和协程\
-
线程\
- 内核态\
- 线程跑多个协程\
- 栈MB级别\
-
协程\
- 用户态\
- 轻量级线程\
- 栈KB级别\
-
-
-
csp\
- 通过通信共享内存,而不是共享内存实现通信\
-
channel\
-
无缓冲和有缓冲\
-
无缓冲\
- 同步\
- make(chan int)\
-
有缓冲\
- 不同步\
- make(chan int, 2)\
- 生产者消费者模型\
-
-
-
sync\
-
并发安全Lock\
- sync.Mutex\
-
waitGroup计数器\
- Add()\
- Done()\
- Wait()\
-
-
-
依赖管理\
-
演进\
-
GoPath\
-
环境变量$GOPATH\
-
bin\
- 项目编译的二进制文件\
-
pkg\
- 项目编译的中间产物,加速编译\
-
src\
- 项目源码\
-
- 项目代码直接以来src下的代码\
- go get下载最新的包到src目录下\
-
弊端\
-
场景\
- A和B依赖某一个package的不同版本\
-
问题\
- 无法实现package多版本控制\
-
-
-
Go Vendor\
-
解决了GoPath同一个package版本冲突问题\
- 每个项目引入一份依赖副本\
-
弊端\
- 无法控制以来的版本\
- 更新可能会出现依赖冲突\
-
-
Go Module\
- 通过go mod文件管理依赖包版本\
- 通过go mod/go get指令工具管理依赖包\
-
-
三要素\
-
配置文件,描述依赖\
-
go.mod\
-
indirect\
-
A->B->C\
- A、B直接依赖\
- A、C间接依赖\
-
-
imcompatible\
- 对于没有go.mod文件也版本号为2+的依赖会使用到\
-
-
-
中心仓库管理依赖库\
-
本地工具\
-
go mod\
-
init\
- 初始化,创建go mod文件\
-
download\
- 下载模块到本地缓存\
-
tidy\
- 增加需要的依赖,删除不需要的依赖\
-
- go get\
-
-
-
-
测试\
-
单元测试\
-
流程\
- 输入\
- 测试单元\
- 输出\
- 输出和期望校对\
-
优点\
- 保证代码质量\
- 问题排查定位精准\
-
规则\
- 以_test.go结尾\
- func TestXxx(t *testing.T)\
- 初始化逻辑放在TestMain中\
-
assert工具\
- 有较多的方法可以利用\
-
覆盖率\
- go test xxx_test.go --cover\
-
-
mock测试\
-
依赖\
-
需要保持\
- 幂等\
- 稳定\
-
-
打桩\
- 用函数A替换函数B\
- A为打桩函数\
- B为原函数\
-
A依赖B\
- mock的对象就是B,避免A对B的直接依赖\
-
-
基准测试\
- 对某个功能的性能进行量化或对比性的测试\
-
覆盖率依次增加,成本依次减少\
-
回归测试\
- 手动点击主要的逻辑\
-
集成测试\
- 自动化测试接口功能性\
-
单元测试\
- 开发者对单独的函数功能测试\
-
-
-
项目实战\
-
需求描述\
-
社区话题页面\
- 展示话题(标题、文字描述)和回帖列表\
- 仅实现本地web服务\
- 话题和回帖数据用文件存储\
-
-
需求用例\
-
用户浏览话题页面\
-
用户\
- user\
-
话题页面\
- topic\
- post list\
-
-
-
E-R图\
-
话题-回帖:一对多\
-
topic\
- id\
- title\
- content\
- create_time\
-
post\
- id\
- topic_id\
- content\
- create_time\
-
-
-
组件工具\
-
gin高性能go web框架\
- go get github.com/gin-gonic/g…\
- go mod\
-
-
运行测试\
- go run server.go\
- curl --location --request GET "http://0.0.0.0:8080/community/page/get/2\
-