这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
详细知识点介绍
线程与协程
线程属于内核态,一个线程可以跑上万个协程,MB级别
协程属于用户态,是轻量级线程,KB级别
Go不支持创建系统线程,所以协程是一个Go程序内部唯一的并发实现方式。Go程序启动时只有一个协程,被称为主协程,一个协程可以用go关键字在函数调用前开启更多的协程,当函数调用退出后,这个新的协程就结束了
下图为一个协程的生命周期
通道
通道基于不要让计算通过共享内存来通讯,而应该让它们通过通讯来共享内存的设计思想,前者采用互斥锁,后者采用GO语言中的通道
func main() {
c := make(chan int)
defer close(c)
f1 := func(c chan<- int, x int) {
c <- x * x
}
for i := 1; i <= 5; i++ {
go f1(c, i)
}
var cnt int
for v := range c {
fmt.Println(v)
cnt++
if cnt == 5 {
break
}
}
fmt.Println("end")
}
锁
除了通道外,GO语言也支持锁的使用,比如syns标准包中的sync.Mutex互斥锁和sync.RWMutex读写锁
依赖管理
三要素
go.mod --- 配置文件描述依赖
中心仓库的管理依赖库 --- Proxy
本地工具 --- go get
语义化版本
${MAJOR}.${MINOR}.${PATCH}
MAJOR为大版本,可以看成不兼容
MINOR保持在MAJOR下兼容
PATCH为bug修复版本
单元测试
不同类型的测试分为不同文件,测试文件以_test.go结尾
在一个文件内写测试的函数
在main函数中进行单元测试的准备和资源回收
- 测试的初始化
- 进行单元测试
- 测试完成后进行释放资源等收尾工作
单元测试的一般覆盖率在50%至60%左右,较高覆盖率在80%,测试分支需要相互独立、全面覆盖,测试单元的力度要足够小,每个测试函数的职责需要单一
引用参考
Golang101-v1.19.e.pdf-ForPrinting