1.一些并发相关概念
Goroutine协程:
协程:用户态,轻量级线程,栈MB级别
线程:内核态,线程跑多个协程,栈KB级别
使用go func(){}()匿名函数即可启用协程
通过通信共享内存,channel:
make(chan type, cap),分为有缓冲与无缓冲通道
无缓冲通道,即cap为0,要求发送方和接收方的goroutine同时准备好,才能完成发送和接收操作,如果有一个还没准备好,会导致另一个goroutine被阻塞。
有缓冲通道,cap不为0,可以缓解生成消费的压力。
并发安全,Lock,WaitGroup:
使用lock sync.Mutex,调用lock.Lock()和lock.Unlock()保护共享资源
waitgroup计数器开启协程+1,执行结束-1,主线程阻塞直到计数器为0
使用wg sync.WaitGroup,调用wg.Add()添加计数,调用wg.Done()使其-1,调用wg.Wait()进行阻塞
2.依赖管理
框架,日志等可以使用sdk,如何管理sdk?
gopath:bin, pkg, src
依赖的代码放在src文件夹下,但存在依赖版本不一致的问题
govender:存放当前项目的一个依赖副本,解决了多个项目依赖冲突的问题
但存在依赖的几个sdk所依赖的sdk存在冲突
go module:通过go.mod文件管理依赖包版本,go mod指令添加依赖
go.mod描述配置文件
proxy作为中心仓库管理依赖库
本地工具 go get/mod
go.mod中, //indirect表示非直接依赖 //+incompatible表示可能存在不兼容
proxy会缓存所有依赖的所有版本,实现稳定依赖
go mod init 初始化,创建go.mod
go mod download,下载sdk到本地
go mod tidy,清除不需要依赖,添加需要依赖
3.测试
单元测试,mock测试,基准测试
单元测试:
所有文件都以.go结尾 ,函数命名func TestXxx(*testing.T), 使用m.Run()启用包下所有测试函数
Mock测试:
对于某些不容易构造或者不容易获取的比较复杂的对象,用一个虚拟的对象(Mock 对象)来创建以便测试的测试方法
基准测试:
测试代码性能分析