这是我参与「第五届青训营 」笔记创作活动的第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指令工具管理依赖包
依赖管理三要素
- 配置文件,描述依赖
go.mod - 中心仓库管理依赖库
Proxy - 本地工具
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