这是我参与「第三届青训营 -后端场」笔记创作活动的第2篇笔记
day02-Go语言上手-工程实践
课程代码地址:github.com/Moonlight-Z… 其中包括今日学习的所有代码:
1.并发编程
1.1Goroutine
- 协程:用户态,轻量级线程-MB级别,协程使用'go'实现
- 线程:用户态,线程可以并发跑多个协程(上万左右也可);比协程更耗资源
1.2 CSP
提倡通过通信去共享内存,而不是通过共享内存实现通信
1.3Channel
make(chan 元素类型,[缓冲大小])
1.4并发安全Lock
1.5WaitGroup
小结:
- Goroutine:协程,go可以通过高效地调度模型实现高并发操作
- Channel:go提倡通过通信去共享内存
- Sync:其中的Lock和WaitGroup关键字,实现并发安全操作和协程间的同步
2.依赖管理
学会利用他人开发好的工具 更多关注自身业务逻辑
2.1Go依赖管理演进:
- GOPATH-> Go Vender -> Go Module
- 不同环境(项目)依赖的版本不同,要控制依赖库的版本
- 目前的版本都直接是Go Module了
2.2依赖管理三要素:
- 配置文件,描述依赖 -> go.mod
- 中心仓库管理依赖库 -> Proxy(依赖分发)
- 本地工具 -> go get/mod
答案:B(选择最低兼容版本)
3.测试
回归测试
↓
集成测试
↓
单元测试
从上到下,覆盖率逐层变大,成本逐层降低
3.1单元测试
- 使用assert包可以实现equal/not equal的比较 代码覆盖率:
- 衡量代码是否经过了足够的测试
- 评价项目的测试水准
- 评估项目是否达到了高水准测试等级 tips:
- 一般覆盖率: 50%~ 60%,较高覆盖率80%+
- 测试分支相互独立、全面覆盖。
- 测试单元粒度足够小,函数单一职责。
3.2 单元测试-依赖
幂等:每次运行相同的测试case时的结果都是一样的 稳定:单元测试可以相互隔离,在任何时间。任何函数可以独立运行
3.4单元测试-Mock
- monkey组件地址:github.com/bouk/monkey
- 快速mock函数:
- 为一个函数打桩
- 为一个方法打桩
最终测试时调用的是打桩函数
3.5基准测试
使用方法类似单元测试
- 小结:
- 单元测试
- mock测试(有外部依赖时)
- 基准测试(性能)
4.项目实战
4.1需求
- 实现一个展示话题(标题,文字描述)和回帖列表的后端http接口;
- 本地文件存储数据;
4.2 需求分析
- 实体:Topic和Postlist(一对多的关系)
- 画用例图和ER图方便理解
4.4 分层结构
- 数据层:数据Model,外部数据的增删改查
- 逻辑层:业务Entity,处理核心业务逻辑输出
- 视图层:视图view,处理和外部的交互逻辑
4.5 组件工具
- Gin高性能Go web 框架
- Go Mod
- go mod init
- go get gopkg.in/gin-gonic/gin.v1@v1.3.0
4.6 Repository-index
使用map做查询,将数据行映射为内存Map
Topic查询:
4.7Service
- 实体:PageInfo
- 流程:参数校验-准备数据-组装实体
- 话题信息和回帖信息可以并行处理:
4.8 Controller
构建View对象 + 业务错误码
4.9 Router
通过gin搭建web框架
4.10 运行测试
- go run server.go
- curl 127.0.0.1:8080/community/page/get/2 (最后的2代表第二个话题)
- 也可浏览器输入:http://localhost:8080/community/page/get/1
小结:
- 项目拆解
- 代码设计
- 测试运行 一般与端上交互就是暴露http接口,端上拿到json化的response来渲染页面