这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
并发:多线程程序在一个核的cpu上运行
并行:多线程程序在多个核的cpu上运行
线程: 用户态,轻量级线程,栈 MB 级别
协程: 内核态,线程跑多个协程,栈 KB 级别
Channel
- make(chan 元素类型,缓冲大小])
- 无缓冲通道 make(chan int)
- 有缓冲通道 make(chan int,2)
WaitGroup
- Add(delta int) 计数器+delta
- Done() 计数器-1
- Wait() 阻塞直到计数器为0
计数器
-
开启协程+1;
-
执行结束-1;
-
主协程阻塞直到计数器为0.
-
bin 项目编译的二进制文件
-
pkg 项目编译的中间产物,加速编译
-
src 项目源码
-
项目代码直接依赖 src下的代码
-
go get 下载最新版本的包到 src 目录下
Go Vendor
项目目录下增加 vendor 文件,所有依赖包副本形式放在 $ProjectRoot/vendor 依赖寻址方式: vendor => GOPATH
通过每个项目引入一份依赖的副本 解决了多个项目需要同一个 package 依赖的冲突问题
Go Module
- 通过 go.mod 文件管理依赖包版本
- 通过 go get/go mod 指令工具管理依赖包
依赖管理三要素
- 1.配置文件,描述依赖 go.mod
- 2.中心仓库管理依赖库 Proxy
- 3.本地工具 go get/mod
go get example.org/pkg
- @update默认
- @none删除依赖
- @v1.1.2tag版本,语义版本
- @23dfdd5特定的commit
- @master分支的最新commit
go mod
- init 初始化,创建go.mod文件
- download 下载模块到本地缓存
- tidy 增加需要的依赖,删除不需要的依赖
测试
单元测试
- 所有测试文件以test.go 结尾
- func TestXxx(*testing.T)
- 初始化逻辑放到 TestMain 中
- github.com/stretchr/testify/assert"
单元测试-Tips
- 一般覆盖率: 50%~60%,较高覆盖率80%+
- 测试分支相互独立、全面覆盖。
- 测试单元粒度足够小,函数单一职责
单元测试- Mock
monkey : github.com/bouk/monkey
快速 Mock 函数
-
为一个函数打桩
-
为一个方法打桩
-
monkey.Patch(ReadFirstLine, func( string {return "line110“})
对 ReadFirstLine 打桩测试,不再依赖本地文件
基准测试
-
需要对当前代码分析优化代码,
-
内置的测试框架提供了基准测试的能力