02进击Go语言 | 青训营笔记

61 阅读2分钟

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


课程知识点记录

一、并发vs并行

  • 并发与并行

    • 并发:多线程程序在一个核的cpu上运行
    • 并行:多线程程序在多个核的cpu上运行->可以理解为实现并发的一个手段
  • Go语言可以充分发挥多核优势,高效运行

  • 协程与线程

    • 协程:用户态,轻量级线程
    • 线程:内核态,线程跑多个协程
  • Go开启协程:在func前加上go

  • 协程间的通信提倡通信共享内存而不是通过共享共享内存而实现通信(后者会影响性能,但Go语言两者都支持)

    image.png

  • channel操作:

    • make(chan 元素类型, [缓冲大小])
    • 不设置缓冲大小即无缓冲通道
    • channel是并发安全的
    • 带缓冲的channel能解决生产消费效率不均的问题
  • Sync

    • 并发安全Lock: 加锁保证并发安全
    • WaitGroup:计时器+阻塞实现协程的快速运行

二、依赖管理

  • Go依赖管理演进:GOPATH -> Go Vendor -> GoModule

  • GOPATH

    image.png

    • 弊端:无法实现包的多版本控制
  • Go Vendor

    • 增加vendor文件,引入依赖副本
    • 依赖寻址方式:vendor->GOPATH
    • 弊端:无法控制依赖版本,更新项目可能会造成版本冲突
  • Go Module (类似JAVA中的Maven)

    • 通过go.mod管理依赖包版本

    • 通过go get/mod隔离依赖包

    • 依赖管理三要素:

      1. 配置文件,描述依赖 go.mod
      2. 中心仓库:proxy
      3. 本地工具 go get/mod
    • go.mod配置

      image.png

      • 版本 语义化版本:${MAJOR}.${MINOR}.${PATCH} 基于commit伪版本:如v0.0.0-20211112202133-69e39bad7dc2
      • indirect->间接依赖
      • incompatible
      • 依赖图:选择最低的兼容版本
    • 依赖分发:使用Proxy

    • 工具

      • go get

        image.png

      • go mod

        image.png

三、测试

  • 测试简介
    • 测试一般分为回归测试、集成测试和单元测试,回归测试一般是手动通过终端回归一些固定的主流程场景,集成测试是对系统功能维度做测试验证,而单元测试测试开发阶段,开发者对单独的函数、模块做功能验证,层级从上至下,测试成本逐渐减低,而测试覆盖率确逐步上升,所以单元测试的覆盖率一定程度上决定这代码的质量。
  • 单元测试 image.png
  • Mock测试 image.png
  • 基准测试
    • Go 语言提供了基准测试框架,基准测试是指测试一段程序的运行性能及耗费 CPU 的程度。而我们在实际项目开发中,经常会遇到代码性能瓶颈,为了定位问题经常要对代码做性能分析,这就用到了基准测试。使用方法类似于单元测试。