go语言工程实践 | 青训营笔记

120 阅读1分钟

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

线程 vs 协程

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

Go 依赖管理演进

GOPATH -> Go Vendor -> Go Module

GOPATH
  • 项目代码直接依赖 src 下的代码。
  • go get 下载到最新版本的包到 src 目录下。 问题: 无法实现 package 的多版本并发控制。
Go vendor
  • 项目目录下增加 vendor 文件,所有依赖包副本形式放在 $ProjectRoot/vendor
  • 依赖寻址方式: vendor => GOPATH 问题:无法控制依赖的版本,更新项目又可能出现依赖冲突,导致编译错误。
Go Module
  • 通过 go.mod 文件管理依赖包版本。
  • 通过 go get/go mod 指令工具管理依赖包。

依赖配置 version

语义化版本 :V{MAJOR}.{MINIOR}.{PATCH},例如:v1.3.0 基于 commit 伪版本 :

vx.0.0-yyyymmddhhmmss-abcdefgh1234

依赖配置 indirect

A->B->C

A直接依赖于B,间接依赖于C

依赖配置 incompatible

  • 主版本2+模块会在模块路径增加/vN 后缀

  • 对于没有 go.mod 文件并且主版本2+的依赖,会+incompatible

依赖分发-回源

问题:

  • 无法保证构建稳定性(增加修改删除软件版本)
  • 无法保证依赖可用性(删除软件)
  • 增加第三方压力(代码托管平台负载问题)

依赖分发-Proxy

缓存依赖的代码和版本,稳定可靠。

项目测试

  • 单元测试
  • Mock测试
  • 基准测试

分层结构

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