这是我参与「第五届青训营 」笔记创作活动的的第2天
本文导航:
- 语言进阶
- 依赖管理
- 测试
语言进阶
1.高并发
进程-->线程-->多线程-->协程
1)进程
描述的就是程序的执行过程,是运行着的程序的代表。
并发
进程的单个内核把cpu的执行时间切分成许多的时间片段,分配给不同的进程。例如,流水线的工作,工人就是cpu,不同的时间处理不同物品。
并行
多个cpu执行多个不同的进程
进程的缺点
一是内核的管理成本高,二是无法简单地通过内存同步数据,所以引入了多线程
2)线程
线程对应的英文名称为“thread”,它的功能是执行应用程序中的某个具体任务,比如一段程序、一个函数等。线程和进程之间的关系,类似于工厂和工人之间的关系,进程好比是工厂,线程就如同工厂中的工人。
多线程
一个进程中拥有多(≥2)个线程,线程之间相互协作、共同执行一个应用程序。
线程的缺点
线程内存占用,线程切换耗时
3)协程
协程就是用户态的线程。通常创建协程时,会从进程的堆中分配一段内存作为协程的栈
2.CSP(communicating sequential processes)并发模型
通信共享内存和共享内存实现通道
3.Channel(通道)
make(chan元素类型,[缓冲大小])
- 无缓冲通道 make(chan int)
- 有缓冲通道 make(chan int,2)
依赖管理
1.GOPATH
- 环境变量$GOPATH
- 项目代码直接依赖src下的代码
- go get 下载最新版本的包到src目录下
弊病:无法实现package的多版本控制
2.GO Vendor
- 项目目录下增加vendor文件,所有依赖包副本形式放在$ProjectRoot/vendor
- 依赖寻址方式: vendor => GOPATH
弊病:无法控制依赖的版本,更新项目又可能出现依赖冲突,导致编译出错。
3.Go Module
- ·通过go.mod文件管理依赖包版本·
- 通过go get/go mod指令工具管理依赖包
4.依赖管理三要素**
-
配置文件,描述依赖 go.mod
- go.mod version indirect incompatible
- 依赖图:选择最低的兼容版本
-
中心仓库管理依赖库 Proxy
- 回原,proxy,变量GOPROXY
-
本地工具 go get/mod
- go get
- go mod
测试
单元测试
- 单元测试-规则
- 所有测试文件以_test.go 结尾
- func TestXxx(*testing.T)
- 初始化逻辑放到TestMain中
- 单元测试-覆盖率
- 一般覆盖率:50%~60%,较高覆盖率80%+。
- 测试分支相互独立、全面覆盖。
- 测试单元粒度足够小,函数单一职责。
- 单元测试-Mock
- 为一个函数
- 为一个方法打桩
基准测试
- 优化代码,需要对当前代码分析
- 内置的测试框架提供了基准测试的能力