这是我参与「第三届青训营 -后端场」笔记创作活动的的第2笔记
day2
Go实现了并发性能极高的调度模型,可以充分发挥多核计算机的优势
协程Goroutine
go func() {
//do something
}()
Go鼓励通过通信共享内存,也可以通过共享内存实现通信
通信 Channel
func calSquare() {
src := make(chan int)
dest := make(chan int, 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)
}
}
并发安全 Lock
go func() {
for i := 0; i < 1000; i++ {
lock.Lock()
x+=1
lock.Unlock()
}
}()
并发同步 WaitGroup
var wg sync.WaitGroup
wg.Add(2) // 计数器
go func() {
defer wg.Done() //计数器--
//do something
}()
go func() {
defer wg.Done()
//do something
}()
wg.Wait() //计数器为0之前阻塞
Go 依赖
Q 为啥要控制依赖
A不同环境(项目)依赖的版本不同
依赖管理历史: GOPATH ~> Go Vendor ~> Go Module
GOPATH
项目直接依赖于src下面的代码,go get下载最新版本的包在src目录下,无法实现包的多版本控制
Go Vendor
依赖包副本形式存在$ProjectRoot/vendor
依赖寻址:vendor ~>GOPATH
无法控制依赖的依赖的版本(应该无病句
Go Module *
- 配置文件,描述依赖 go.mod
- 中心仓库管理依赖库(实现稳定的依赖分发) Proxy
- 本地工具 go get / mod
Go Module能够定义版本规则和管理项目依赖关系。
对于间接依赖会在require里面用 //indirect标识,对于可能存在不兼容的依赖会用+incompatible标识。
如果同时用到了两个不同版本的间接依赖,会在满足依赖的同时优先选择版本较低的
go module issus
Newest 'go-modules' Questions - Stack Overflow
Modules · golang/go Wiki (github.com)
一些常用命令
go set go111module="on" //开启go module
go mod init
go mod download
go mod tidy
go mod verify
go get
测试
回归测试、集成测试、单元测试
单元测试
测试文件命名以_test.go结尾
import(
"github.com/stretchr/testify/assert"
)
func TestSomething(t *testing.T) {
output := Something()
expectOutput := "loomt"
assert.Equal(t, expectOutput, output)
}
Mock 测试
替换函数、方法
基准测试
分析性能
需求分析
ER图
| 数据层Repository | 逻辑层Service | 视图层Controller |
|---|---|---|
| 数据Model,外部数据的增删改查 | 业务Entity,处理核心业务逻辑输出 | 视图View,处理和外部的交互逻辑 |
项目
高并发场景下可以用sync.Once减少时空花费
从数据库(本地)拿数据的流程:参数校验*(避免服务端查询出错) ~> 准备数据(可以用并发同步WaitGroup提高效率) ~> 组装实体
Gin 搭建Web框架
- 初始化数据
- 初始化引擎配置
- 构建路由
- 启动服务