Go 高性能编程 | 青训营笔记

37 阅读2分钟

1 语言进阶

并发编程了解go高性能

1.1 并发和并行

image.png

1.2 Goroutine

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

image.png

1.3 CSP(Communicating Sequential Processes)

提倡通过通信共享内存

image.png

1.4 Channel

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

  • 无缓冲通道 make(chan int) ,发送和接受的Goroutine同步化。
  • 有缓冲通道 make(chan int, 2)

image.png

1.5 并发安全Lock

主要解决竞态

1.6 WaitGroup

实现并发任务的同步

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

2 依赖管理

go语言依赖管理的演进路线GOPATH -> Go Vendor -> Go Module,现如今主要使用GoMOD

2.1 GOPATH

项目代码直接依赖src下的代码,go get 下载最新版本的包到src目录下

  • 弊端
    • 场景:A和B依赖于某一package的不同版本
    • 问题:无法实现package的多版本控制 image.png

2.2 Go Vendor

项目目录增加vendor文件,所有依赖包副本形式放在$ProjectRoot/vendor

依赖寻址方式:vendor => GOPATH

  • 弊端
    • 无法控制依赖版本
    • 更新项目可能出现依赖冲突,导致编译出错

image.png

2.3 Go Module

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

2.3.1 管理三要素

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

2.3.2 依赖配置

2.3.2.1 go.mod

image.png

2.3.2.2 version

  • 语义化版本 ${MAJOR}.${MINOR}.${PATCH}, 如V3.3.0
  • 基于commit 伪版本Vx.0.0-yyyymmddhhmmss-abcdefgh1234

2.3.2.3 indirect

A->B->C

  • A->B 直接依赖
  • A->C 间接依赖

2.3.2.4 incompatible

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

image.png

2.3.3 依赖分发-Proxy

image.png

GOPROXY="https://proxy1.cn, https://proxy2.cn ,direct"

  • "direct"表示源站
  • Proxy1 -> Proxy2 -> Direct

2.3.4 go get

image.png

2.3.5 工具 go mod

image.png

3 测试

单元测试,Mock测试,基本测试相关

3.1 单元测试

image.png

3.1.1 规则

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

3.1.2 assert

image.png

3.1.3 覆盖率

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

3.1.4 依赖

image.png 外部依赖 => 稳定(相互隔离)&幂等(重复运行结果一致)

3.2 mock

monkey : github.com/bouk/moneke… 快速mock函数

  • 为一个函数打桩
  • 为一个方法打桩

image.png

ReadFirstLine打桩测试,不再依赖本地文件

3.3 基准测试

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

3.3.1 基准测试 -例子

随机执行服务器 image.png

基准测试例子: image.png

4 项目实战

需求设计,代码开发,测试运行

4.1 需求描述

image.png

4.2 需求用例

image.png

4.3 ER图

image.png

4.4 分层结构

image.png

  • 数据层:数据Model,外部数据的怎删改查
  • 逻辑层:业务Entity,处理核心业务逻辑输出
  • 视图层:属兔view,处理和外部的交互逻辑

4.5 组件工具

image.png