[ Go进阶及工程实践 | 青训营笔记 ]
这是我参与「第五届青训营」伴学笔记创作活动的第 2 天
零、前言:
记个笔记顺便(恰青豆还是有很多不完善也有可能对的地方还请大佬们指正
一、本堂课重点内容:
高并发
依赖管理
软件测试
项目实战
二、详细知识点介绍:
2.1 高并发
-
Goroutine
协程是一种用户态的轻量级线程,协程的调度完全由用户控制。一个线程可以多个协程,一个进程也可以单独拥有多个协程。
-
Channel 无缓冲chan要用放在协程
go里面,放在主协程会堵塞chan关闭任可读但是不可写
-
Sync
:lock:lock 锁
lock sync.Mutex //初始化 lock.Lock() lock.Unlock()waitgroup 内部有一计数器 这样末尾就不用加
time.Sleep()来等待协程了wg := sync.WaitGroup{} wg.Add(100) // 初始化计数器为100 wg.Done() // 完成一个协程计数器减一 wg.Wait() // 等待计数器为0
2.2 依赖管理
依赖配置会选择最低向下兼容的版本
常用指令
go mod init #初始化,创建go.mod文件
go mod download #下载模块到本地缓存
go mod tidy # 增加需要依赖
2.3 测试
测试文件以 _test.go 结尾
函数 func TestXxx(*testing.T)
初始化逻辑放在 TestMain(m *Testing.M) 里面
-
单元测试
asser.Equal(t,希望结果,实际结果) -
覆盖率测试
go test xx.go --cover -
Mock
monkey GitHub - bouk/monkey: Monkey patching in Go 打桩的目的
打桩的目的主要有:隔离、补齐、控制。
隔离是指将测试任务从产品项目中分离出来,使之能够独立编译、链接,并独立运行。隔离的基本方法就是打桩,将测试任务之外的,并且与测试任务相关的代码,用桩来代替,从而实现分离测试任务。例如函数A调用了函数B,函数B又调用了函数C和D,如果函数B用桩来代替,函数A就可以完全割断与函数C和D的关系。
补齐是指用桩来代替未实现的代码,例如,函数A调用了函数B,而函数B由其他程序员编写,且未实现,那么,可以用桩来代替函数B,使函数A能够运行并测试。补齐在并行开发中很常用。
控制是指在测试时,人为设定相关代码的行为,使之符合测试需求
-
基准测试
以
BenchmarkXxx(b *testing.B)开头 用于测试性能go test -bench=.
2.4 实战
没有当时的原文件还是有点难理解的
sync.Once 是 Go 标准库提供的使函数只执行一次的实现
大概是读取文件用map存数据降低耗时
具体还要再看看
三、总结:
感觉每次实战理解还是要花点时间啊啊啊