这是我参与「第五届青训营 」笔记创作活动的第2天
课程内容
- 并发编程 协程、通道、线程同步
- 依赖管理 Go Module
- 单元测试 单元测试、Mock测试与基准测试
- 项目实战 青训营话题页的简单模拟开发
并发编程
并发:多线程程序在一个核的 CPU 上运行
并行:多线程程序在多个核的 CPU 上运行
协程:用户态、轻量级线程,栈 MB 级别
线程:内核态,线程跑多个协程,栈 KB 级别
CSP:提倡通过通信共享内存而非通过共享内存实现通信
Channel
make(chan int)\\无缓冲通道
make(chan int,2)\\有缓冲通道
lock:lock.Lock(),lock.Unlock()
waitgroup:开启协程用Add()【计数器增加若干】,协程执行结束用Done()【计数器-1】,阻塞用Wait()【等待计数器为0】
依赖管理
Go依赖管理演进:
- GoPath 无法实现package的多版本控制
- GoVender 无法控制依赖的版本。更新项目又可能出现依赖冲突,导致编译出错。
- GoModule 可以定义规则管理关系。
三要素:
- 配置文件,描述依赖 go.mod
- 中心仓库管理依赖库 Proxy
- 本地工具 go get/mod
go.mod:
【version】语义化版本${MAJOR}.${MINOR}.${PATCH}
基于commit伪版本vX.0.O-yyyymmddhhmmss-abcdefgh1234(时间戳+随机哈希码)
【关键词】indirect表示非直接依赖
对于没有go.mod且主版本在2以上的添加+incompatible
【编译时选择最低兼容版本】
本地工具:
【go get】
- @update 默认
- @none 删除依赖
- @v1.1.2 tag版本,语义版本
- @23dfdd5 特定的commit
- @master 分支的最新commit
【go mod】
-
init 初始化,创建go.mod文件
-
download 下载模块到本地缓存
-
tidy 增加需要的依赖,删除不需要的依赖
单元测试
单元测试:
所有测试文件以_test.go 结尾
func TestXxx(*testing.T)
初始化逻辑放到TestMain中
- 一般覆盖率:50-60%, 较高覆盖率80%+
- 测试分支相互独立、全面覆盖
- 测试单元粒度足够小,函数单一职责
项目实战
分层结构:
- 数据层:数据Model,外膜数据的CRUD
- 逻辑层:业务Entity,处理核心业务逻辑输出
- 视图层:视图View,处理和外部的交互逻辑
总结
自我感觉go的部分工程知识,与Java的相关想法都是类似的,存在Maven类似的管理仓库,有MVC的开发思路,也有框架的快速搭建来方便开发。