GO语言入门-工程实践 | 青训营笔记

79 阅读3分钟

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

本节课主要内容梳理

image.png

语言进阶

并发VS并行

  • 并发可以同时处理好多事情。
  • 并行是同时做好多事情。 Go可以充分发挥多核优势,高效运行

Goroutine

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

image.png 用go开启协程

time.Sleep()休眠,来阻塞

输出结果,乱序输出,并行

image.png

CSP(Communicating Sequential Processes)

  • 通过通信共享内存
  • 通过共享内存实现通信 提倡通过通信共亨内存而不是通过共字内存而实现通信

Channel

make(chan元素类型,[缓冲大小])

  • 无缓冲通道 make(chan int)
  • 有缓冲通道 make(chan int,2)

并发安全Lock

通过lock()和Unlock()实现

image.png

WaitGroup

  • Add(delta int) 计数器+delta
  • Done() 计数器-1
  • Wait()阻塞直到计数器为0

实例代码

image.png

依赖管理

背景

  • 工程项目不可能基于标准库0~1编码搭建
  • 管理依赖库

Go依赖管理演进

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

GOPATH

image.png

  • 项目代码直接依赖src下的代码
  • go get下载最新版本的包到src目录下 GOPATH弊端:无法实现package的多版本控制

Go Vendor

通过每个项目引入一份依赖的副本, 解决了多个项目需要同一个 package依赖的冲突问题。

  • 项目目录下增加vendor文件,所有依赖包副本形式放在$ProjectRoot/vendor
  • 依赖寻址方式: vendor =>GOPATH Go Vender弊端:无法控制依赖的版本。 更新项目又可能出现依赖冲突,导致编译出错。

Go Module

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

依赖管理三要素(类似于maven)

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

依赖配置 go.mod

依赖标识:[Module Path] [Versin/Pseudo-version]

依赖配置-version

gaopath和govendor都是源码副本方式依赖,没有版本规则概念,而gomod为了放方便管理则定义了版本规则,分为语义化版本和基于commit伪版本

依赖配置-indirect

image.png

依赖配置-incompatible

  • 主版本2+模块会在模块路径增加/vN后缀。
  • 对于没有 go.mod文件并且主版本2+的依赖,会+incompatible

依赖分发-Proxy

figo proxy就是解决这些问题的方案,Go Proxy是一个服务站点,它会缓源站中的软件内容,缓存的软件版本不会改变,并且在源站软件删除之后依然可用

依赖分发-变量GOPROXY

GOPROXY="proxy1.cn, proxy2.cn ,direct"
服务站点URL列表,direct表示源站

go get

image.png

go mod

image.png

测试

  • 回归测试
  • 集成测试
  • 单元测试 从上到下,覆盖率逐层变大,成本却逐层降低

单元测试

  • 所有测试文件以_test.go结尾
  • func TestXxx(*testing.T)
  • 初始化逻辑放到TestMain中

image.png

image.png

  • 一般覆盖率:50%~60%,较高覆盖率80%+。
  • 测试分支相互独立、全面覆盖。
  • 测试单元粒度足够小,函数单一职责。

单元测试-Mock

image.png 摆脱了本地文件的束缚和依赖

基准测试

  • 优化代码,需要对当前代码分析
  • 内置的测试框架提供了基准测试的能力 image.png

项目实战就不记录了,因为还不太明白=v=

遇事不决,可问春风!