Go 语言进阶-工程进阶 | 青训营笔记

63 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第2天。
一、本堂课重点内容:

  • 语言进阶:从并发编程的视角了解Go语言高性能的本质。
  • 依赖管理:了解Go语言依赖管理的演进路线
  • 测试:单元测试实践,提升质量意识
  • 项目实战:感受真实项目开发:项目需求》需求拆解》逻辑设计》代码实现

二、详细知识点介绍:

  1. 并发 vs 并行
  • Go可以充分发挥多核优势,为并发而生
    1.1 Goroutine 协程
  • 协程是用户级、轻量级线程,线程跑多个协程
  • 调用函数时函数名前加go关键字即可调用协程
    1.2 CSP(Communicating Sequential Processes)
  • 提倡通过通信共享内存而不是通过共享内存而实现通信
    1.3 Channel
  • make(chan 元素类型,[缓冲大小])
    1.4 并发安全Lock
  • 加锁:lock.Lock()
    1.5 WaitGroup
  • Add(delta int) 计数器+delta
  • Done() 计数器-1
  • Wait() 阻塞直到计数器为0
  1. 依赖管理
    2.1 Go依赖管理演进
  • GOPATH >> Go Vendor >> Go Module
    2.1.1 GOPATH
  • bin:项目编译生成的二进制文件
  • pkg:项目编译的中间产物,加速编译
  • src:项目源码
  • 弊端:无法实现package的多版本控制。
    2.1.2 Go Vender
  • 项目目录下增加vender文件,每个项目引入一份依赖的副本,解决依赖冲突的问题。
  • 弊端:无法控制依赖版本
    2.1.3 Go Module
  • 通过go.mod文件管理依赖包版本
  • 实现终极目标:定义版本规则和管理项目依赖关系。
    2.2 依赖管理三要素
  • 配置文件,描述依赖:go.mod
  • 中心仓库管理依赖库:Proxy
  • 本地工具:go get/mod
    2.3.1 依赖配置-go.mod
  • 依赖管理基本单元
  • 原生库
  • 单元依赖:[Module Path][Version]
    2.3.2 依赖配置-version
  • 语义化版本:MAJOR、MINOR、PATCH
  • 基于commit伪版本:vX.0.0-yyyymmddhhmmss-abcdefgh1234(版本号、时间戳、哈希校验码)
  • 关键字"//direct"非直接依赖;"+incompatible":对于没有go.mod且主版本2+的依赖 2.3.4 选择最低的兼容版本 2.3.5 依赖分发-Proxy
  • 缓存源站中版本,稳定可靠
  • 变量GOPROXY,URL站点列表+源站
    2.3.6 工具-go get go get exampke.org/pkg
  • @update 默认
  • @none 删除依赖
  • @v1.1.2 tag版本,语义版本
  • @23dfdd5 特定的commit
  • @master 分支的最新commit go mod
  • init 初始化,创建go.mod文件
  • download 下载模块
  • tidy 增加需要的依赖,删除不需要的依赖
  1. 测试
    3.1 单元测试
    3.1.1 规则
  • 所有测试文件以_test.go结尾
  • 测试函数格式:func TestXxx(*testing.T)
  • 初始化逻辑放到TestMain中:测试前数据装载、配置初始化,测试后释放资源及收尾工作
    3.1.2 评估-代码覆盖率
  • 通过对各个分支进行完备的测试
  • 一般覆盖率:50-60%,较高覆盖率80%+
    3.2 单元测试-Mock
  • 快速Mock函数:为一个函数打桩(A函数替换B函数,A为打桩函数)、为一个方法打桩
    3.3 基准测试
  • 优化代码,需要对当前代码分析
  • 测试程序运行性能,对硬件资源损耗等
  1. 项目实践
    4.1 需求描述
    4.2 需求用例
  • 根据需求描述抽取出实体
    4.3 ER图(Entity Relationship Diagrom)
  • 实体及实体间关系
    4.4 分层结构
  • 数据层:数据Model,外部数据的增删改查
  • 逻辑层:业务Entity,处理核心业务逻辑输出
  • 视图层:识图View,处理和外部的逻辑交互
    4.5 组件工具
  • Gin 高性能go web 框架
  • Go Mod

三、课后个人总结: 本节课程了解了Go语言依赖管理的演进路线,学习了测试的方法,感受了真实项目开发过程。对项目开发有很大的指导意义。