这是我参与「第三届青训营 -后端场」笔记创作活动的的第 2 篇笔记 ~
1 语言进阶
并发编程、Go语言高性能的本质
并发:多线程程序在一个核的cpu运行
并行:多线程程序在多个核的cpu上运行
协程:用户态、轻量级、栈MB
线程:内核态、跑多个协程、栈KB级别
go语言创建协程、调用函数
go + 函数名
CSP
通过通信、共享内存
相当于消息队列
channel
关键字 make(chan 元素类型, [缓大小])
无缓冲通道 make(chan int)
同步通道
并发编程
设置lock
sync包下的一些关键字
2 依赖管理
不同环境(项目)依赖的版本不同
gopath(古老)
|- bin 编译的二进制文件
|- pkg 编译的中间产物,提速
|-src 项目源代码
直接依赖src下 的代码
go get下载最新的包到src下
无法实现多版本控制
go vendor
在项目目录下增加vendor文件,项目所有依赖包副本都放这
解决了多个项目需要同一个package依赖的冲突问题
缺点:出现不同依赖包的不兼容问题,无法控制依赖的版本
go module
通过 go.mod 文件管理依赖包版本
go mod init 初始化,创建 go.mod文件
go mod download 下载模块到本地缓存
go mod tidy 增加需要的依赖,删除不需要的依赖
中心仓库管理依赖库 Proxy【依赖分发】
通过 go get/ go mod 指令工具管理依赖包
语义化版本
基于commit
选择最低的兼容版本
v1.4兼容v1.3,这里最低的意思是,如果有v1.5,也还是选v1.4
测试
单元测试、质量意识
单元测试
规则
测试文件以 _test.go结尾
函数命名 func TestXxx
初始化逻辑放到 fun TestMain
单元测试例子
assert包
评估单元测试:代码覆盖率
因为score大于60,前两行被验证,return false没有,所以是 2/3,66.7%
较高覆盖率 80%+
一般覆盖率 50 - 60%
测试分支互相独立、全面覆盖
测试单元粒度足够小,函数单一职责
依赖的组件
数据库、cache、文件
目标
幂等:重复运行同一个,结果一样
稳定
Mock
如果涉及到外部依赖,运用mock测试
调用打桩函数,后面把这个卸载,unpatch
完全不依赖本地环境文件
基准测试
用本地测试,简便
fastrand随机场景
项目实战
项目需求
社区话题页面,展示话题、回帖列表
仅实现本地web服务,本地文件存储
分层结构
提高代码的可读性
例子:
数据层:屏蔽下游的数据差异
service:对数据层封装
组件工具
gin
go mod
go mod init (初始化)
go get
代码实现
定义索引,让表之间被发现
repository/db_init.go
初始化标题数据索引
打开文件,遍历,存储为结构体
xx索引
实现查询
topiconce适用于高并发
实现根据话题查询帖子
service逻辑层封装
并行
同时获取repository两个查询,获取话题数据
controller
定义错误、进行类型转换、创建page页面
Router搭建web框架
实现接口
运行测试
go run server.go
拿到jaison化的response,再渲染页面