这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
-
并发知识
-
goroutine
- go支持协程:内核态,线程跑多个协程,栈KB级别
- 通过 go 关键字来开启 goroutine 即可
go 函数名( 参数列表 )
-
CSP(Communication Sequential Processes)
-
Channel
- 通道(channel)是用来传递数据的一个数据结构。
- 通道可用于两个 goroutine 之间通过传递一个指定类型的值来同步运行和通讯。操作符 <- 用于指定通道的方向,发送或接收。如果未指定方向,则为双向通道。
ch <- v // 把 v 发送到通道 ch
v := <-ch // 从 ch 接收数据
// 并把值赋给 v
- 声明:chan关键字,使用前必须创建
ch := make(chan int
-
缓冲区:带缓冲区的通道允许发送端的数据发送和接收端的数据获取处于异步状态
-
ch := make(chan int, 100) //100 为缓冲区大小 -
如果通道不带缓冲,发送方会阻塞直到接收方从通道中接收了值
-
如果通道带缓冲,发送方则会阻塞直到发送的值被拷贝到缓冲区内
-
如果缓冲区已满,则意味着需要等待直到某个接收方获取到一个值。接收方在有值可以接收之前会一直阻塞。
-
-
并发安全Lock
保证共享内存中数据安全
//声明
lock sync.Mutex
//加锁
lock.Lock()
//释放锁
lock.Unlock()
-
WaitCroup
-
依赖管理
-
Go Module
- 通过go.mod文件管理依赖包版本
| 命令 | 作用 |
|---|---|
| go mod init | 生成 go.mod 文件 |
| go mod download | 下载 go.mod 文件中指明的所有依赖 |
| go mod tidy | 整理现有的依赖 (拉取缺少的模块,移除不用的模块) |
| go mod graph | 查看现有的依赖结构 |
| go mod edit | 编辑 go.mod 文件 |
| go mod vendor | 将依赖复制到vendor目录下 |
| go mod verify | 校验一个模块是否被篡改过 |
| go mod why | 查看为什么需要依赖某模块 |
-
通过go get/go mod指令工具管理依赖包
-
go get xx:下载xxx第三方依赖包并安装
-
go install xxx(安装xxx二进制可执行文件 )
-
-
测试
-
单元测试
- 测试文件以_test.go结尾
- func TestXxx(*testing.T)
- 初始化逻辑放到TestMain中
go test [flags] [packages]
-
覆盖率
go test judgment_test.go judgment.go --cover
-
Mock
Monkey: 可以对method,或者实例的方法进行mock,反射,指针赋值
-
快速mock函数
- 为一个函数打桩
- 为一个方法打桩