Lesson 2. GO语言工程实践|青训营笔记

183 阅读4分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记 内容为5.8第二次课

一、语言进阶 从并发编程了解Go高性能本质

  1. 并发&并行

Go可以充分发挥多核优势,高效运行——为并发而生;

多线程程序在一个核的cpu上运行——并发(利用时间片的切换来提高)

多线程程序在多个核的cpu上运行——并行

 

两者都是系统的对外状态

并行是实现并发的手段

 

  1. Goroutine

image.png 协程:用户态,轻量级线程,栈MB级别

线程:内核态,线程跑多个协程,栈KB级别

补充:进程 线程 协程的区别和联系:

image.png

 

线程是进程的基本执行单位 协程是线程的基本执行单位(进程 线程 协程轻量级逐渐增高 执行效率也逐渐增高)

要求快速:开多个协程解决

Go开多个协程的方法——调用函数时在该函数前+关键字 go 即开一个协程

  1. CSP(协程之间的通信)

GO提倡通过通信共享内存,而不是通过共享内存而实现通信

image.png

  1. Channel——一种引用类型

由make 关键字 (chan元素类型,  [缓冲大小])来创建

无缓冲通道——make(chan int)

有缓冲通道——make(chan int 2)//容量为2的int型缓冲通道

image.png 无缓冲通道:直接传输

 

 

  1. 并发安全——+  (Lock)                                                                               

 

 

  1. WaitGroup——协程间的同步

(接5)在调用临界区的内容之前用lock.Lock() 保护数据 调用之后lock.Unlock释放 以保证并发安全

(接6)计数器 Add(delta int)每开启一个子协程+1(输入的int具体值表示子协程的个数)

            Done() 每个 子协程执行结束-1

            Wait() 主协程阻塞直到计数器为0 表示所有的并发任务完成

 

二、依赖管理 —— Go M oudle实践                                      

  1. 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实现终极目标:定义版本规则和管理项目依赖关系

  1. 依赖管理三要素

  配置文件、描述依赖——go.mod

   中心仓库管理依赖库——Proxy

  本地工具——go get/mod

  1. 依赖配置 —— 依赖图

 

第二点防止不兼容

  1. 依赖分发——回源

P r ox y 应运而生

Go Proxy是一个服务站点,他会缓存源站中的软件内容,缓存的软件版本不会改变,切在源站删除

后依然可以使用,从而实现依赖分发

先从proxy1寻找 找不到再  prox2 还找不到就到direct找

  1. 工具——go get

  2. 工具——go mod

tidy以减少项目运行的时间

 

三、测试 —— 单元测试、  Mock测试、基准测试                   

1. 测试是避免事故的最后一个屏障

2   回归测试——QA,通过手动测试终端回归一些固定主流程场景 如评论等等

  集成测试——系统功能维度做测试验证

单元测试——对单独的函数、模块做功能验证

层级从下至上,测试代码成本逐渐降低,测试覆盖率逐步上升

  1. 单元测试

 第二点为命名规则 代码覆盖率越高 则测试越靠谱

(接上)外部依赖-》稳定 幂等分析性能

 

四、项目实践 —— 需求设计、代码开发、测试运行              

需求描述

社区话题页面

  1. 展示话题(标题,文字)和回帖

  2. 一个本地web服务

  3. 话题和回帖用文件存储

 

需求分析:

E - R

分层结构

数据层关联底层数据模型(model),数据存储在本地文件,通过文件操作拉取话题,帖子数据 数据层面向逻辑层,对service层透明,屏蔽下游数据差异

service逻辑层计算打包业务实体entiy,对应我们的需求,并上送给视图层

Controller视图层以view视图形式返回给客户端,对于我们的需求,封装json格式化的请求结果,  api的 形式访问

组件工具

github.com/gin-gonic/g…  索引:话题ID

数据:话题(帖子列表)