这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记 内容为5.8第二次课
一、语言进阶 从并发编程了解Go高性能本质
- 并发&并行
Go可以充分发挥多核优势,高效运行——为并发而生;
多线程程序在一个核的cpu上运行——并发(利用时间片的切换来提高)
多线程程序在多个核的cpu上运行——并行
两者都是系统的对外状态
并行是实现并发的手段
- Goroutine
image.png 协程:用户态,轻量级线程,栈MB级别
线程:内核态,线程跑多个协程,栈KB级别
补充:进程 线程 协程的区别和联系:
线程是进程的基本执行单位 协程是线程的基本执行单位(进程 线程 协程轻量级逐渐增高 执行效率也逐渐增高)
要求快速:开多个协程解决
Go开多个协程的方法——调用函数时在该函数前+关键字 go 即开一个协程
- CSP(协程之间的通信)
GO提倡通过通信共享内存,而不是通过共享内存而实现通信
- Channel——一种引用类型
由make 关键字 (chan元素类型, [缓冲大小])来创建
无缓冲通道——make(chan int)
有缓冲通道——make(chan int 2)//容量为2的int型缓冲通道
无缓冲通道:直接传输
- 并发安全——+
(Lock)
- WaitGroup——协程间的同步
(接5)在调用临界区的内容之前用lock.Lock() 保护数据 调用之后lock.Unlock释放 以保证并发安全
(接6)计数器 Add(delta int)每开启一个子协程+1(输入的int具体值表示子协程的个数)
Done() 每个 子协程执行结束-1
Wait() 主协程阻塞直到计数器为0 表示所有的并发任务完成
- Go依赖管理
GOPATH——Go Vendor——Go Moudle
不同环境依赖版本不同
GOPATH
环境变量——bin、 pkg (编译的中间产物)、 src (项目源码)
项目直接依赖src代码
go get要下载最新的包在src下
Go Vendor
增加vender文件夹,所有依赖包在vender有副本,优先在vendor中寻找 若无再在gopath中寻找 寻找解决了多个项目需要同一个package依赖冲突的问题
Go Moudle
通过go.mod文件管理依赖包版本
通过goget/go mod指令工具管理依赖包
可以通过go module实现终极目标:定义版本规则和管理项目依赖关系
- 依赖管理三要素
配置文件、描述依赖——go.mod
中心仓库管理依赖库——Proxy
本地工具——go get/mod
- 依赖配置 —— 依赖图
第二点防止不兼容
- 依赖分发——回源
P r ox y 应运而生
Go Proxy是一个服务站点,他会缓存源站中的软件内容,缓存的软件版本不会改变,切在源站删除
后依然可以使用,从而实现依赖分发
先从proxy1寻找 找不到再 prox2 还找不到就到direct找
-
工具——go get
-
工具——go mod
tidy以减少项目运行的时间
1. 测试是避免事故的最后一个屏障
2 回归测试——QA,通过手动测试终端回归一些固定主流程场景 如评论等等
集成测试——系统功能维度做测试验证
单元测试——对单独的函数、模块做功能验证
层级从下至上,测试代码成本逐渐降低,测试覆盖率逐步上升
- 单元测试
第二点为命名规则 代码覆盖率越高 则测试越靠谱
(接上)外部依赖-》稳定 幂等分析性能
需求描述
社区话题页面
-
展示话题(标题,文字)和回帖
-
一个本地web服务
-
话题和回帖用文件存储
需求分析:
E - R图
分层结构
数据层关联底层数据模型(model),数据存储在本地文件,通过文件操作拉取话题,帖子数据 数据层面向逻辑层,对service层透明,屏蔽下游数据差异
service逻辑层计算打包业务实体entiy,对应我们的需求,并上送给视图层
Controller视图层以view视图形式返回给客户端,对于我们的需求,封装json格式化的请求结果, api的 形式访问
组件工具
github.com/gin-gonic/g… 索引:话题ID
数据:话题(帖子列表)