这是我参与「第五届青训营」伴学笔记创作活动的第 2 天
一、本堂课重点内容:
- Go语言进阶:从并发编程的视角了解Go高性能的本质
- 依赖管理:了解Go语言依赖管理的演进路线
- 测试:从单元测试出发,提升质量意识
- 项目实战:通过项目需求、需求拆解、逻辑设计、代码实现感受真实的项目开发
二、详细知识点介绍:
-
- 并发和并行:
- 1.1 Goroutine 协程:
充分发挥多核优势,高效运行
- 协程:用户态,轻量级线程,栈MB级别
- 线程:内核态,线程跑多个协程,栈KB级别
- 1.2 CSP(Communicating Sequential Processes):
- 提倡通信共享内存而不是通过共享内存而实现通信
- 1.3 Channel 通道
- make(chan元素类型,[缓冲大小])
- 无缓冲通道 make(chan int)
- 有缓冲通道 make(chan int,2)
- make(chan元素类型,[缓冲大小])
- 1.4 并发安全 Lock
- 1.5 WaitGroup
- Add(delta int) 计数器+delta;
- Done() 计数器-1;
- Wait() 阻塞直到计数器为0
-
2.依赖管理
- 2.1 背景
- 工程项目不可能基于标准库0~1编码搭建
- 管理依赖库
- 2.2 依赖管理演进
- GOPATH
- 环境变量$GOPATH
- 项目代码直接依赖src下的代码
- go get下载最新版本的包到src目录下
- 弊端:无法实现package的多版本控制
- Go Vendor
- 项目目录下增加vendor文件,所有依赖包副本形式放在$ProjectRoot/vendor
- 依赖寻址方式:vendor => GOPATH
- 通过每个项目引入一份依赖的副本,解决了多个项目需要同一个package依赖的冲突问题
- 弊端:无法控制依赖的版本;更新项目有可能出现依赖冲突
- Go Module(广泛应用)
- 通过go.mod文件管理依赖包版本
- 通过go get/go mod指令工具管理依赖包
- 终极目标:定义版本规则和管理项目依赖关系
- 依赖管理三要素
- 配置文件,描述依赖 go.mod
- 中心仓库管理依赖库 Proxy
- 本地工具 go get/mod
- GOPATH
- 2.3 Go Module实践
- 2.1 背景
-
3.测试
- 单元测试
- 规则
- 测试文件以_test.go结尾
- func TestXxx(*testing.T)
- 初始化逻辑放到TestMain中
- 例子
- 运行
- assert
- 覆盖率
- 一般覆盖率50-60%,较高覆盖率80%
- 测试分支相对独立、全面覆盖
- 测试单元粒度足够小,函数单一职责
- 规则
- Mock测试
- monkey : github.com/bouk/monkey
- 快速Mock函数
- 为一个函数打桩
- 为一个方法打桩
- 快速Mock函数
- monkey : github.com/bouk/monkey
- 基准测试
- 优化代码,需要对当前代码分析
- 内置的测试框架提供了基准测试的能力
- 单元测试
-
4.项目实战
- 需求描述
- 展示话题和回帖列表
- 暂不考虑前端页面实现,仅仅实现本地web服务
- 话题和回帖数据用文件存储
- 代码实现
- E-R图
- Topic
- id
- title
- content
- create_time
- Post
- id
- topic_id
- content
- create_time
- Topic
- 分层结构
- 数据层:数据Model,外部数据的增删改查
- 逻辑层:业务Entity,处理核心业务逻辑输出
- 视图层:视图view,处理和外部的交互逻辑
- 组件工具
- Gin高性能 go web框架
- https://github,com/gin-gonic/gin#installation - Go Mod
- go mod init
- go get gopkg.in/gin-gonic/gin.v1@v1.3.0
- Router
- 主函数
- 初始化数据索引
- 初始化引擎配置
- 构建路由
- 启动服务
- 主函数
- E-R图
- 运行测试
- go run server.go
- 需求描述
三、课后个人总结:
- 好好学习 天天向上