Go语言进阶 | 青训营笔记

28 阅读1分钟

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

一、协程

屏幕截图_20230116_154508.png

启动协程的方法:go 函数名

屏幕截图_20230116_154932.png

time.Sleep阻塞,保证子协程执行完之前主线程不退出。

二、通道 Channel

屏幕截图_20230116_155429.png

1.无缓冲通道是同步通信,也称同步通道。

2.缓冲区满时会阻塞通道。

一个生产消费者例子:A子协程发送0~9数字,B子协程计算平方,主协程输出。

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

屏幕截图_20230125_204309.png

可见不加锁可能会输出未知的结果。

四、WaitGroup

Sync包下,保证子协程执行完之前主线程不退出的方法。

屏幕截图_20230116_160406.png

改善上面的代码:

屏幕截图_20230116_160616.png

四、依赖管理

1.依赖管理演进

GOPATH -> Go Vendor -> Go Module

2.GOPATH

GOPATH是一个环境变量。

项目代码直接依赖src下的包。

弊端:无法实现多版本控制。

3.Go vendor

项目目录增加Vendor文件,存放依赖包的副本。

Vendor中没有,再去GOPATH找。

弊端:更新可能出现不兼容。

4.Go Module

通过 go.mod 文件管理依赖包版本。

通过 go get/go mod 指令工具管理依赖包。

屏幕截图_20230116_162612.png

选择最低的兼容版本。

三要素:

1.配置文件,描述依赖:go.mod

2.中心仓库管理依赖库:Proxy

3.本地工具:go get/mod

go.mod文件:

屏幕截图_20230125_205437.png

依赖配置-version

语义化版本:MAJOR.MINOR.PATCH

V1.3.0

MAJOR版本间不兼容。

基于commit伪版本:vx.0.0-yyyymmddhhmmss-abcdefgh1234

//indirect 间接依赖

+incompatible 可能存在不兼容

5.依赖分发-变量 GOPROXY

GOPROXY="proxy1.cn, proxy2.cn, direct"

五、工具使用

屏幕截图_20230125_210510.png 屏幕截图_20230125_210550.png