01
并发编程
多线程程序在一个核的CPU上运行
Goroutine
协程:用户态,轻量级线程,栈KB级别
线程:内核态,线程跑多个协程,栈MB级别
在函数前加关键字go创建协程
CSP
通过通信共享内存
Channel
make(chan 元素类型, [缓冲大小])
有缓冲通道
make(chan int,2)
无缓冲通道/同步通道
make(chan int)
并发安全LOCK
WaitGroup
实现并发任务的同步
内部维护一个计数器
开启协程+1
执行结束-1
主协程阻塞直到计数器为0
02
依赖管理
Go依赖管理演进
GOPATH->Go vendor->Go Module
GOPATH
bin
项目编译的二进制文件
pkg
编译的中间产物
src
项目源码
项目代码直接以来src下的代码
通过go get下载最新版本的包到src目录下
GOPATH无法实现package的多版本控制
Go Vender
项目目录下增加vendor文件,所有依赖包副本形式放在$ProjectRoot/vendor
依赖寻址方式:vendor=>GOPATH
项目依赖优先从vendor目录下获取
可能出现依赖冲突,编译出错
Go Module
通过go.mod文件管理依赖包版本
通过go get/go mod指令工具管理依赖包
依赖管理
配置文件,描述依赖:go.mod
中心仓库管理依赖库:Proxy
本地工具:go get/mod
依赖配置
依赖标识:[Module Path] [Version/Pseudo-version]
语义化版本
{MINOR}.${PATCH}
不同MAJOR版本可以是不兼容的
MINOR通常是做一些功能和函数更新
PATCH通常是做一些bug修复
commit伪版本
v.x.0.0-yyyymmmmddffss-gcfdtd145275
版本前缀-时间戳-十二位哈希值前缀
关键字
indirect:为直接导入的依赖模块
incompatible:标识可能存在一些不兼容的代码逻辑
go选择版本最低的兼容版本
依赖分发
Proxy
缓存源站中的软件内容
GOPROXY="proxy1.cn,http://proxy2.cn ,direct"
go get
go mod
03
测试
回归测试
集成测试
单元测试
单元测试—规则
- 所有测试文件以_test.go结尾
- func TestXxx(*testing.T)
- 初始化逻辑放到TestMain中
单元测试—运行
go test[flags] [packages]
单元测试—覆盖率
单元测试一般覆盖率为50%~60%,较高覆盖率80%+
测试分支相互独立、全面覆盖
测试单元粒度足够小,函数单一负责
单元测试—依赖
单元测试—Mock
monkey:github.com/bouk/monkey
组件工具
组件以及技术点
web框架:Gin
在vscode中生成go.mod文件后,在终端输入
go get -u github.com/gin-gonic/gin
将gin引入到代码中
import "github.com/gin-gonic/gin"