Go语言进阶及依赖管理|青训营笔记

114 阅读2分钟

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

一、本堂课重点内容:

本节课了解go语言高性能的本质、go依赖管理和项目实战

二、详细知识点介绍:

1.并发编程

  • 具有多核优势

  • 采用多协程

    • 开启协程:在调用函数的前面加上go关键字

    • 补充:time.Sleep(time.Second)用于堵塞,用于保证子协程在协程完主协程不退出

  • 提倡通过通信共享内存

  • 并发安全lock

    lock.Lock()
    程序...
    lock.Unlock()
    
  • WaitGroup 计数器作用:开启协程+1,执行结束-1,主协程阻塞直到计数器=0

    • 三个方法:
      1. Add(delta int):+delta
      2. Done():-1
      3. Wait():阻塞直到计数器=0 小结:
  • Goroutine

  • Channel

  • Sync

2.依赖管理

演进:

GOPATH->Go Vendor->Go Module

2.1GOPATH

bin:项目编译的二进制文件

pkg:项目编译的中间产物,加速编译

src:项目源码

弊端:

无法实现package的多版本控制

2.2 Go Vendor

项目依赖会先找vendor,找不到再找gopath

弊端:

更新项目可能出现依赖冲突

2.3 Go Module
  • go.mod:文件管理依赖包版本
  • go get/go mod:指令工具管理依赖包
3.依赖管理三要素(类似maven)
  1. go.mod:配置文件,描述依赖
  2. Proxy:中心仓库管理依赖库
  3. go get/mod:本地工具
3.1 go.mod
  • 原生库
  • 单元依赖
3.2version
  • 语义版本

    ${MAJOR}.${MINOR}.${PATCH}

    • major:可以不兼容(代码隔离)
    • minor:兼容,新增函数,功能
    • patch:代码bug修复
  • 基于commit伪版本

vX.0.0-时间戳-12位哈希码的前缀

3.3indirect

A->B->C

A->B:直接依赖

A->C:间接依赖

3.4incompatible

对于没有go.mod文件并且主版本2+的依赖,会+incompatible(可能存在不兼容的代码逻辑)

3.5依赖图

选择最低的兼容版本

3.6依赖分发-回源

使用proxy稳定可靠

GOPROXY=“proxy1.cn,https://proxy2.cn,…

go mod
指令作用
init创建go.mod文件
download下载模块到本地缓存
tidy增加需要的依赖,删除不需要的

4.测试

4.1回归测试

终端的测试

4.2集成测试
4.3单元测试(函数、模块等)

在一定程度上决定了代码的质量

  • 规则
  1. 所以测试文件以_test.go结尾
  2. 格式:func TestXxx(t *testing.T)
  3. 初始化逻辑仿真TestMain中
  • 代码覆盖率:执行的代码行与总代码行之比
  • 依赖
    • 幂等:重复测试结果一样
    • 稳定:任何时间任何函数下都能独立运行
  • Mock(monkey) 函数打桩:用一个函数替换原函数,不对本地文件有强依赖
4.4基准测试

格式:func BenchmarkXxxx(b *testing.B),基准测试函数没有返回值 提倡使用fastrand

b.ResetTimer()//定时器的重置,可以避免for循环之前的初始化代码的干扰
//并行
b.RunParallel(func(pb *testing.PB))