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

55 阅读2分钟

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

一、Go语言进阶-并发编程

0 并发 vs 并行

并发:多线程程序在一个核的cpu上运行(时间片的切换);
并行:多线程程序在多个核的cpu上运行

1 Goroutine

协程:用户态,轻量级线程,栈KB级别;
线程:内核态,线程跑多个协程,栈MB级别;

2 CSP

Go提倡通过通信共享内存,而不是通过共享内存而实现通信;
截图 2022-05-08 213401.jpg

3 channel

channel是一种引用类型;
make(chan 元素类型,[缓冲大小])
无缓冲通道:make(chan int),又称为同步通道;
有缓冲通道:make(chan int, 2)

4 并发安全 lock

不带锁的多协程并发可能会出问题;
避免对共享内存做非并发安全的读写操作;

5 WaitGroup

内置计数器,Add,Done,Wait;
开启协程+1,执行结束-1,主协程会阻塞到计数器为0;

二、依赖管理

Go的依赖管理演进

  • GoPath无法实现package的多版本控制;
  • GoVendor为每个项目引入一份依赖包的副本;但无法控制依赖的版本;
  • GoModule

GoModule三要素

  • 配置文件,描述依赖 go.mod
  • 中心仓库管理依赖库 Proxy
  • 本地工具 go get/mod

三、测试

单元测试

  • 回归测试-->集成测试-->单元测试
    覆盖率逐渐变大,成本逐渐降低

单元测试的规则 :

  • 测试文件以_test.go结尾
  • 函数名为func TestXxx(*testing.T)
  • 初始化逻辑放到TestMain中
    func TestMain(m *testing.M) {
        // 测试前:数据装载、配置初始化等前置工作
        code := m.Run()
    
        // 测试后:释放资源等收尾工作
        os.Exit(code)
    }
    

单元测试-覆盖率

  • 一般覆盖率:50~60%,较高覆盖率80%+
  • 测试分支相互独立、全面覆盖
  • 测试单元粒度足够小,函数单一职责

四、项目实战

1 需求描述

  • 展示话题(标题,文字描述)和回帖列表
  • 暂不考虑前端页面实现,仅仅实现一个本地web服务
  • 话题和回帖数据用文件存储

2 分层结构

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