这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记
1.并行
并发:多线程程序在一核cpu上运行
并行:多线程程序在多核cpu上运行
1.1协程 协程:用户态,轻量级线程,k级别 线程:内核态,mb级别
1.2协程通信 提倡通过通信共享内存
1.3 channel make(chan 元素类型,【缓冲大小】)
1.4并发安全Lock 加锁
1.5WaitGroup sleep暴力
Add(delta int)开启协程计数器加delta
Done()执行结束计数器-1
Wait()主协程阻塞直到计数器为0
小结: Goroutine Channel Sync
2.依赖管理
2.1Go依赖管理演进
-Gopath环境变量$GOPATH bin编译二进制文件,pkg加速编译,src项目源码
弊端:无法实现package的多版本控制
-Go Vendor 项目目录下增加vender文件,依赖包副本形式存在vender里 先找vender,再找Gopath
弊端:无法控制依赖版本,更新项目可能导致依赖冲突
-Go Module 通过go.mod文件管理依赖包版本 go get/go mod指令工具管理依赖包
2.2依赖管理三要素
1.配置文件,描述依赖 go.mod
2.中心仓库管理依赖库 Proxy
3.本地工具 go get/go mod
2.3.1依赖配置-go.mod
依赖表示:【Module Path】【Version/Pseudo-version】
2.3.2依赖配置-version
语义化版本 {MAJOR}.{MINOR}.{PATCH}
基于commit伪版本 vx.0.0-yyyymmddhhmmss-abcdefgh1234(12位hash)
2.3.3依赖配置-indirect
A->B->C ab直接依赖,ac间接依赖
2.3.3依赖配置-incompatible 没有go.mod文件主版本2+的依赖,+标识
2.3.4依赖图 选择最低兼容版本
2.3.5依赖分发-回源 弊端:无法保证稳定性,可用性,增加第三方压力
2.3.5依赖分发-Proxy 从Proxy直接拉取
2.3.6依赖分发-变量GOPROXY url列表
2.3.7工具-go get @update 默认 @none 删去依赖 @特定版本 @特定commit @特定分支
2.3.8工具 -go mod init初始化 download下载模块到本地缓存 tidy增加需要依赖,删除不需要的
3.测试
回归测试-集成测试-单元测试
3.1单元测试 输入-测试单元-输出 单元测试-规则 测试文件以_test.go结尾 func TestXxx(*testing T) 初始化逻辑放到TestMain中
-运行 go test 【flags】【package】
-assert
-覆盖率 一般50%-60% 测试分支相互独立,全面覆盖 测试单元粒度足够小,函数单一职责
3.2单元测试-依赖 外部依赖=》稳定&幂等
3.3单元测试-文件处理
3.4单元测试-mock
快速mock函数 为函数/方法打桩 避免外部依赖
3.5基准测试
优化代码,需要性能分析
4.项目实践
4.1需求描述
4.2需求用例
4.3ER图
4.4分层结构
数据层-逻辑层-视图层
4.5组件工具