工程进阶 | 青训营笔记

57 阅读1分钟

工程进阶 | 青训营笔记

并发与并行

并发:

image-20230116205956583.png

并行:

image-20230116210009980.png

Go可以充分发挥多核优势,高效运行。

Go语言并发模型

  • Goroutinue 模型

image-20230116210112030.png

  • CSP模型(Comunicating Sequential Processes)

image-20230116210340693.png

  • Channel 模型

    • 无缓冲通道 make(chan int) 有收有放才能恢复
    • 有缓冲通道 make(chan int,2) 通道为空时取阻塞直至通道不为空恢复 通道满的时候放阻塞直至通道有位置恢复

image-20230116210705916.png

  • 互斥锁 Lock

image-20230116210730105.png

  • WaitGroup

image-20230116210800389.png

依赖管理

版本一 GOPATH

image-20230116210908667.png

代码直接依赖 $gopath/src 内的东西

缺点:没法实现package的多版本控制 (src只能存在一个版本的代码)

版本二 Go Vendor

image-20230116211034576.png

增加一个vendor目录,先找vendor 再找 $GOPATH/src

缺点:

  • 无法控制依赖的版本(间接依赖版本冲突,没办法默认适配)
  • 更新项目又可能出现依赖冲突,导致编译出错

版本三 Go Module

  1. 配置文件,描述依赖 go,mod
module $MODULENAME      // 模块的名称go 1.16         //依赖go的版本
​
require (
    github.com/aliyun/aliyun-oss-go-sdk v2.1.6+incompatible
    // incompatible https://blog.csdn.net/zhang197093/article/details/126635058
    github.com/aws/aws-sdk-go v1.42.27
    github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f // indirect
    gopkg.in/ini.v1 v1.55.0 // indirect     // 这个代表简介依赖
    // [Module Path] [Version/Pseudo-version]
    // Version   语义化版本
    // ${MAJOR}.${MINOR}.${PATCH}
    //Pseudo-version
    //vx.0.0-yyyymmddhhmmss-abcdefgh1234       
    //版本号-时间戳-commithash
)
​

image-20230116213302908.png

  1. 中心仓库管理依赖库 proxy

image-20230116213317110.png

image-20230116213335033.png

image-20230116213348004.png

  1. 本地工具 go get/mod

image-20230116213438064.png

image-20230116213403745.png image-20230116213356656.png

测试

如何控制测试的依赖?

因为单元测试不免有外部依赖,要达成测试算法的稳定与幂等就需要引入Mock

image-20230116213551503.png

可以利用一些库来实现Mock功能 github.com/bouk/monkey…