协程:
协程与进程区别
协程:用户态,轻量级线程,栈MB级别。
线程:内核态,线程跑多个协程,栈KB级别。
使用:
go使用go关键字开启一个协程
csp:
并发提倡通过通信共享内存而非 通过共享内存实现通信
channel
channel实质上是一个循环队列
有两种初始化:
有缓冲区:make(chan int,n),n代表多少个缓冲区
无缓冲区:make(chan int,0)
当没有缓冲区时channel里面就不能有额外空间存放数据,因此当一个数据放入管道中,必须有数据接收管道里的数据,该进程才会继续向下运行,否则则会一直阻塞。
并发安全lock
go中sync中包中含有读锁和写锁对并发进行安全限制,锁的使用往往对一行操作进行锁操作。而go中对并发安全进行加锁的方式主要用sync包中的Mutex,RWMutex,WaitGroup,Once,Map这几个api进行操作
```
func (m Mutex) Lock() 获取互斥锁
func (m Mutex) Unlock() 释放互斥锁func (rw RWMutex) Lock() 获取写锁
func (rw RWMutex) Unlock() 释放写锁func (rw RWMutex) RLock() 获取读锁
func (rw RWMutex) RUnlock() 释放读锁func (rw *RWMutex) RLocker() Locker 返回一个实现Locker接口的读写锁
func (wg WaitGroup) Add(delta int) 计数器+1
func (wg WaitGroup) Done() 计数器-1
func (wg *WaitGroup) Wait() 阻塞直到计数器变为0...
go依赖管理
gopath
bin:项目编译的二进制文件
pkg:项目编译的中间产物,加速编译
src:项目源码
go vender
- 项目目录下增加vendor文件,所有依赖包副本形式放在$ProjectRoot/vendor
- 依赖寻址方式: vendor => GOPATH
- 通过每个项目引入一份依赖的副本,
解决了多个项目需要同一个package依赖的冲突问题。 - 弊端:
go Module
- 通过go.mod文件管理依赖包
- 通过go get/go mod 指令工具管理依赖包
- 目标:定义版本规则和管理项目依赖关系
依赖管理三要素:
- 1.配置文件,描述依赖go.mod
- 2.中心仓库管理依赖库Pro
- 3.本地工具 get/modgo
工具:
- go get
- go mod
测试:
单元测试:
图解:
规则:
- 所有测试文件以_test.go结尾
- func Testxxx(*testing.T)
- 初始化逻辑放在TestMain中
示例:
assert
用于纠正错误
代码覆盖率
用于评估项目的测试水准
用大量测试用例覆盖测试函数的各种情况
- 一般覆盖率:50%~60%,较高覆盖率80%+。
- 测试分支相互独立、全面覆盖。
- 测试单元粒度足够小,函数单一职责。
依赖
- 幂等
- 稳定
文件处理示例:
Mock 为函数打桩
基准测试:
- 优化代码,需要对当前代码分析
- 内置的测试框架提供了基准测试的能力