GO语言并发与依赖管理 | 青训营笔记

49 阅读1分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天

详细知识点介绍

线程与协程

线程属于内核态,一个线程可以跑上万个协程,MB级别

协程属于用户态,是轻量级线程,KB级别

Go不支持创建系统线程,所以协程是一个Go程序内部唯一的并发实现方式。Go程序启动时只有一个协程,被称为主协程,一个协程可以用go关键字在函数调用前开启更多的协程,当函数调用退出后,这个新的协程就结束了

下图为一个协程的生命周期

image-20230116155706990.png

通道

通道基于不要让计算通过共享内存来通讯,而应该让它们通过通讯来共享内存的设计思想,前者采用互斥锁,后者采用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