语言进阶之并发编程
| 类别 | 权限状态 | 量级 | 栈大小 |
|---|---|---|---|
| 协程 | 用户态 | 轻量级 | 栈KB |
| 线程 | 内核态 | 线程跑多个协程 | 栈MB |
- 提倡通过通信共享内存而不是通过共享内存实现通信
- 创建格式make(chan deltype, [buffersize]),后一个参数控制缓冲通道的大小,0参为无缓冲通道
- 使用lock实现并发同步
- 使用WaitGroup进行阻塞
依赖管理
- 演变:GOPATH->GO Vendor->GO MODULE
- 环境变量 $GOPATH bin为二进制文件 pkg为中间代码 src为源代码 问题是无法实现package的多版本控制
- 项目目录下存放vendor,每个项目引入一份依赖的副本 问题是无法控制依赖的版本,更新项目可能出现冲突
- go.mod通过go get和go mod指令工具管理依赖包,可以定义版本规则
- goproxy依赖分发 GOPROXY="url1,url2,direct"
- go mod本地命令 init初始化 download下载模块 tidy增加需要的依赖,删除不需要的
测试(单元测试、Mock测试、基准测试)
回归测试、集成测试、单元测试 覆盖面更广成本更低
单元测试
- 测试文件以_test.go结尾
- func TestXxx(t *testing.T)
- 初始化逻辑放到TestMain中
- 使用--cover测试代码覆盖率,一般覆盖率50%-60%,测试分支相互独立,全面覆盖
Mock测试
开源Mock库 github.com/bouk/monkey
对函数进行打桩测试,不再依赖本地文件
基准测试
- func BenchmarkXxx(b *testing.B)
- 一个快速测试模块,可以减少性能损耗 github.com/bytedance/g…
项目实战
实现一个社区话题页面(不使用前端页面和数据库)
- 使用分层结构:数据Model 逻辑Entity 视图View
- 涉及到的组件工具:Gin 高性能go web框架
go mod init
go get gopkg.in/gin-gonic/gin.v1@v1.3.0
学习心得
协程并发与通信同步是非常重要的功能,go mod init和tidy功能非常常用,在构建实际项目的过程中可以经常使用来简化配置,本节课程的内容还是非常丰富的,也需要我们花费比较多的时间来学习,尤其是项目实际构建和设计,项目拆解,测试运行等内容也为后面设计大项目打下基础。