[ Go语言进阶和依赖管理,工程实践之测试| 青训营笔记]

72 阅读2分钟

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

并发 VS 并行

  1. 多线程程序在一个核的 cpu 上运行
  2. 多线程程序在多个核的 cpu 上运行

协程(Goroutine)VS 线程

  1. 用户态,轻量级线程,栈 MB 级别
    1. 协程的创建:在函数前加上go
      eg.go func(...){...}
  2. 内核态,线程跑多个协程,栈 KB 级别
  3. 通信(CSP):通过通信共享内存
  4. 通道(Channel):
    1. 通过通信共享内存
      1. 创建:make(chan 元素类型,[缓冲大小])
      2. 无缓冲通道:make(chan int)
      3. 有缓冲通道:make(chan int,2)
  5. Sync:
    1. 通过共享内存实现:并发安全 Lock
      eg. func xx (){lock.Lock() [要加锁的操作] lock.Unlock}
    2. WaitGroup:
      1. 创建:var xx sync.WaitGroup
      2. 加入协程:xx.Add([协程数])
      3. 对计数器减一:defer xx.Done()
      4. 阻塞:wg.Wait()

依赖管理

  1. 实现目标:
    1. 不同环境(项目)依赖的版本不同
    2. 控制依赖库的版本
  2. GOPATH image.png
    1. 项目代码直接依赖到 src 下的代码
    2. go get 下载最新版到 src 下
    3. 弊端:无法实现 package 的多版本控制
  3. GO Vendor
    1. 通过每个项目引入一份依赖的副本解决了多个项目需要同一个 package依赖的冲突问题
    2. 弊端:
      ① 无法控制依赖的版本
      ② 更新项目又可能出现依赖冲突,导致编译出错.
  4. GO Module
    1. 通过 go.mod 文件管理依赖包版本
    2. 通过 go get/go mod 指令工具管理依赖包
    3. 终极目标: 定义版本规则和管理项目依赖关系
    4. 依赖管理三要素:
      1. go.mod:配置文件,描述依赖
        image.png
        1. 依赖配置-version
          1. 语义化版本 image.png
          2. 基于 commit 版本 image.png
        2. 依赖配置-indirect
          image.png
          对于没没有直接依赖的依赖标识为 indirect
        3. 依赖配置-incompatible
          1. 主版本2+模块会在模块路径增加/N 后缀
          2. 对于没有 go.mod 文件并且主版本2+的依赖,会+ incompatible
        4. 依赖分发-回源
          弊端:
          1. 无法保证构建稳定性:增加/修改/删除软件版本
          2. 无法保证依赖可用性:删除软件
          3. 增加第三方压力代码托管平台负载问题
        5. 依赖分发-Proxy
          image.png
        6. 依赖分发-变量- GOPROXY
          1. GOPROXY="proxy1.cn, proxy2.cn,direct"
          2. direct'服务站点URL列表,“direct"表示源站 image.png
        7. 工具-go get image.png
        8. 工具-go mod image.png
      2. Proxy:中心仓库管理依赖库
      3. go get/mod:本地工具
  5. 测试
    image.png
    1. 单元测试 image.png
      1. 规则
        1. 所有测试文件以 test.go 结尾
        2. func TestXxx(*testing.T) image.png
        3. 初始化逻辑放到 TestMain 中 image.png
    2. 覆盖率 image.png image.png
    3. 依赖
      image.png
    4. Mock
      image.png
    5. 基准测试
      1. 优化代码,需要对当前代码分析
  6. 项目实践
    1. 分层结构 image.png
    2. 组件工具
      image.png