工程实践 | 青训营笔记

55 阅读2分钟

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

语言进阶

Go可以充分发挥多核优势,高效运行

协程:用户态,轻量级线程,栈MB级别

线程:内核态,线程跑多个协程,栈KB级别

Go语言一次可以创建上万个左右的协程。

Go提倡通过通信共享内存而不是通过共享内存而实现通信

依赖管理

GOPATH => Go C=Vendor => Go Module

bin 项目编译的二进制文件

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

src 项目源码

项目代码直接以来src下的代码

go get下载最新版本的包到src目录下

可能存在的弊端:

无法实现package的多版本控制 => 项目目录下增加vendor文件,所有依赖包副本形式放在$ProjectRoot/vender;以来寻址方式:vendor => GOPATH(每个项目引入一份依赖的副本)

关于Go Module

通过go.mod文件管理依赖包版本

通过go get/go mod指令工具管理依赖包

依赖管理三要素

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

一个go.mod文件

module example/prohect/app      //依赖管理单元
​
go 1.16     //原生库require (       //单元以来
    example/lib1 v1.0.2
    ...
)

依赖配置

语义化版本(不同的MAJOR之间可以是代码隔离的/MINOR通常是一些新增函数或者功能/代码修复)

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

基于commit伪版本

vX.0.0-yyyymmddhhmmss-absdwe

Go在进行依赖配置时,若存在依赖多个版本,则会选择最低的兼容版本。

工具-go mod

init 初始化,创建go.mod文件

download 下载模块到本地缓存

tidy 增加需要的依赖,删除不需要的依赖

测试

测试是避免事故的最后一道屏障

回归测试 => 集成测试 => 单元测试 (从左到右,测试覆盖率变大,成本逐渐降低)

规则:

所有测试文件以_test.go结尾

func TestXxx(*testing.T)

初始化逻辑放到TestMain

可以使用一些开源的assert包,导入github.com/stretchr/testify/assert

并在测试类中这样写assert.Equal(t,xx,xxx)

单元测试-Mock

常用包:https://github.com/bouk/monkey

[使用 Gomock 进行单元测试​]  eddycjy.gitbook.io/golang/di-1… 

项目实战

项目需求

社区话题页面

  • 展示话题(标题,文字描述)和回帖列表
  • 暂不考虑前端页面的实现,仅仅实现一个本地web服务
  • 话题和回帖数用文件存储

需求用例 + ER图

分层结构

在创建项目时

通过go mod init,初始化go.mod文件

执行go get gopkg.in/gin-gonic/gin.v1@v1.3.0

Repository=>dd=>service