Go语言上手-工程实践|青训营笔记

204 阅读3分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第2篇笔记

day02-Go语言上手-工程实践

课程代码地址:github.com/Moonlight-Z… 其中包括今日学习的所有代码:

image.png

1.并发编程

1.1Goroutine

  • 协程:用户态,轻量级线程-MB级别,协程使用'go'实现
  • 线程:用户态,线程可以并发跑多个协程(上万左右也可);比协程更耗资源 image.png

1.2 CSP

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

1.3Channel

make(chan 元素类型,[缓冲大小]) image.png

1.4并发安全Lock

image.png

1.5WaitGroup

image.png

小结:

  • 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 image.png 答案:B(选择最低兼容版本)

3.测试

回归测试  
   ↓
集成测试
   ↓
单元测试

从上到下,覆盖率逐层变大,成本逐层降低

3.1单元测试

image.png

  • 使用assert包可以实现equal/not equal的比较 代码覆盖率:
  • 衡量代码是否经过了足够的测试
  • 评价项目的测试水准
  • 评估项目是否达到了高水准测试等级 tips:
  • 一般覆盖率: 50%~ 60%,较高覆盖率80%+
  • 测试分支相互独立、全面覆盖。
  • 测试单元粒度足够小,函数单一职责。

3.2 单元测试-依赖

幂等:每次运行相同的测试case时的结果都是一样的 稳定:单元测试可以相互隔离,在任何时间。任何函数可以独立运行

3.4单元测试-Mock

  • monkey组件地址:github.com/bouk/monkey
  • 快速mock函数:
    • 为一个函数打桩
    • 为一个方法打桩 最终测试时调用的是打桩函数 image.png

3.5基准测试

使用方法类似单元测试

image.png

  • 小结:
    • 单元测试
    • mock测试(有外部依赖时)
    • 基准测试(性能)

4.项目实战

4.1需求

  1. 实现一个展示话题(标题,文字描述)和回帖列表的后端http接口;
  2. 本地文件存储数据;

4.2 需求分析

  • 实体:Topic和Postlist(一对多的关系)
  • 画用例图和ER图方便理解

4.4 分层结构

  • 数据层:数据Model,外部数据的增删改查
  • 逻辑层:业务Entity,处理核心业务逻辑输出
  • 视图层:视图view,处理和外部的交互逻辑

4.5 组件工具

4.6 Repository-index

使用map做查询,将数据行映射为内存Map image.png Topic查询: image.png

4.7Service

  • 实体:PageInfo
  • 流程:参数校验-准备数据-组装实体
  • 话题信息和回帖信息可以并行处理: image.png

4.8 Controller

构建View对象 + 业务错误码 image.png

4.9 Router

通过gin搭建web框架 image.png

4.10 运行测试

小结:

  • 项目拆解
  • 代码设计
  • 测试运行 一般与端上交互就是暴露http接口,端上拿到json化的response来渲染页面