Go语言上手-工程实践 | 青训营笔记

127 阅读3分钟

5月8日Go语言上手-工程实践笔记

这是我参与「第三届青训营 -后端场」笔记创作活动的的第2篇笔记

1.go语言一大特点:快速

2.并发和并行:

  • 并发:多线程程序在同一个核的CPU上运行
  • 并行:多线程程序在多个核的CPU上运行
  • Go可以充分发挥多核优势,高效运行

3.协程和线程:

  • 协程:用户态,轻量级线程,栈KB级别
  • 线程:内核态,线程跑多个协程,栈MB级别

4.go提倡通过通信(eg:通道)共享内存而不是通过共享内存而实现通信

5.管道Channel:

  • 初始化:make(chan type, [Size])
  1. 无缓冲管道:make(chan int)
  • 特点:收发方同步,又称同步通道
  1. 有缓冲管道:make(chan int, num) (num表示缓冲通道的容量大小)

6.Lock实现并发安全控制:

  • 初始化:lock sync.Mutex
lock sync.Mutex
for i := 0; i < 2000; i ++ {
    lock.Lock()
    x += 1
    lock.Unlock()
}

7.WaitGroup:

  • 功能:内部维护了一个计时器,开启线程+1,执行结束-1;主线程阻塞直到计时器为0。
var cnt sync.WaitGroup
cnt.Add( delta: 5)          // 设置初值为5,表示5个协程
for i := 0; i < 5; i ++ {
    go func(j int) {
        defer cnt.Done()           // 一个协程执行结束-1
        hello(j)
    }
}
cnt.Wait()      // 主线程阻塞直到计数器为0

8.Go依赖管理演进: GOPATH -> Go Vendor -> Go Module

  • 不同环境(项目)依赖的版本不同
  • 控制依赖库的版本

9.GOPATH:

  • GOPATH环境变量:bin(项目编译的二进制文件)、pkg(项目编译的中间产物,加速编译)、src(项目源码)
  • 项目代码直接依赖src下的代码
  • go get下载最新版本的包到src目录下
  • 弊端:无法实现package的多版本控制

10.Go Vendor:

  • 项目目录下增加vendor文件,所有依赖包副本形式放在vendor文件夹
  • 通过每个项目引入一份依赖的副本,解决了多个项目需要同一个package依赖的冲突问题
  • 弊端:
  1. 无法控制依赖的版本
  2. 更新项目又可能出现依赖错误,导致编译出错

11.Go Module:

  • 通过go.mod文件管理依赖包版本
  • 通过go get/go mod指令工具管理依赖包

12.依赖管理三要素:

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

13.单元配置:

module example/project/app   // 依赖管理基本单元
go 1.16    // 原生库
require(     // 单元依赖
    ...
)

14.依赖配置——version:

  • 语义化版本 ${MAJOR}.${MINOR}.${PATCH} eg:V1.3.0
  • 基于commit伪版本 vx.0.0-yyyymmddhhmmss(时间戳)-abcdefgh1234(hash校验码)

15.依赖选择:

  • 选择最低的兼容版本 image.png 此时会选择C v1.4

16.依赖分发-回源:

  • 依赖分发:依赖去哪下载(代码管理仓库)
  • 缺点:
    1. 无法保证构建稳定性(增加/修改/删除软件版本)
    2. 无法保证依赖可用性(删除软件)
    3. 增加第三方压力(代码托管平台负载问题)

17.依赖分发-Proxy:

  • Proxy:实际是一个服务站,缓存源站中的软件内容,缓存的软件版本也不改变

image.png

18.工具-go get:

  • go get example.org/pkg 默认拉取的是major版本的最新提交
  • go get example.org/pkg后加:
    1. @update (等于什么都不加) 表示默认
    2. @none 删除依赖
    3. @v1.1.2 tag版本,语义版本
    4. @23dfdd5 特定的commit
    5. @master 分支的最新commit

19.工具-go mod:

  1. go mod init 初始化,创建go.mod文件
  2. go mod download 下载模块到本地缓存
  3. go mod tidy 增加需要的依赖,删除不需要的依赖

20.测试:

  1. 回归测试:手动通过终端回归一些固定的场景检查
  2. 集成测试:通过服务暴露的某些接口进行自动化测试
  3. 单元测试:开发者对单独的函数模块进行验证
  • 从上到下,覆盖率逐层增大,成本逐层降低

21.单元测试:

  • 规则:
    1. 所有测试文件以 _test.go 结尾
    2. func TestXxx(name *Testing.T)
    3. 初始化逻辑放到TestMain中

22.单元测试—Mock:

快速Mock函数:使测试不再依赖本地文件
    为一个函数打桩
    为一个方法打桩