文章第一句话为“这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
1.1Goroutine
协程和线程:
协程是用户态的轻量级线程,栈在mb级别。
线程在内核态,栈在kb级别
go因为使用协程,所以并发性能较好
如何开启一个携程?
需要开启多个协程进行打印
只需要调用 go func 方法即可
for i := 1; i <= 5; i++ {
go func(j int) {
hello(j)
}(i)
}
协程之间如何通信?
Channel
make(chan 元素类型,[缓冲大小])
- 无缓冲通道 make(chan int)
- 有缓冲通道 make(chan int,2)
src := make(chan int)
dest := make(chan int, 3) //缓冲区为3
go func() {
defer close(src)
for i := 0; i <= 10; i++ {
src <- i
}
}()
go func() {
defer close(dest)
for i := range src {
dest <- i * i
}
}()
for i := range dest {
println(i)
}
带缓冲的协程可以减少消费者的消费速度问题导致的生产者的性能浪费
defer close() 可以实现资源的提前关闭
并发安全:锁
不加锁时,多个协程对同一变量进行操作可能会让该变量数值错误。
可以用lock 包下的lock 和unlock来实现锁操作
1.2 依赖管理
Go Vendor
通过每个项目引入一份依赖的副本,解决多个项目需要多一个package依赖的冲突问题
Go Module
- 通过go.mod文件管理依赖包版本
- 通过 go get/go mod 指令工具管理依赖包
go.mod 配置文件,描述依赖
Proxy 中心仓库管理依赖库
go get/mod 本地工具
(类似于java的maven)
版本规则
语义化版本 {MINOR}.${PATCH}
V1.3.0 V2.3.0
基于commit伪版本
vX.0.0-yyyymmddhhmmss- abcdefgh1234
v0.0.0- 20220401081311-c38fb59326b7
v1.0.0- 20201130134442- -10cb98267c6c
1.3 单元测试
规则
单元测试-规则
- 所有测试文件以 _test.go 结尾
- fuc TestXxx
- 初始化逻辑放在TestMain中
使用 go test judgment_test.go judgement.go --cover可以检测测试的完备性
- 一般覆盖率:50% - 60 %
- 测试分支要求相互独立、全面覆盖
- 单元测试粒度足够小,函数单一职责
依赖
Mock
可以实现对一个函数进行打桩:
打桩 : 把原函数替换成另一个
mock可以实现对一个函数或一个方法打桩
可以把一个方法换成另一个方法,方便测试的进行并减少对本地文件的依赖。
执行完后用defer monkey.Unpatch(被替换的函数名)取消打桩
基准测试
- 以Benchmark开头
实现随机选择一台服务器,
1.4分层结构
MVC架构
数据层 : 数据Model,外部数据的增删改查
逻辑层 : 业务Entity, 处理核心业务逻辑输出
视图层 : 视图view,处理和外部的交逻辑
1.5组件工具
Gin高性能 go web框架
Gin高性能go web框架 github.com/gin-gonic/g…
Go Mod go mod init go get gopkg.in/ gin-gonic/ gin.v1@v1.3.0