Go语言进阶-工程进阶 | 青训营笔记

62 阅读3分钟
  • 这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天

1. 重点内容

  • Go语言并发编程
  • 依赖管理
  • 系统测试
  • 项目实战

2. 知识点

2.1 并发编程
  1. Goroutine

    • 线程:用户态,轻量级线程,栈MB级别
    • 协程:内核态,线程跑多个协程,栈KB级别
  2. CSP(Communicating Sequential Process)

    • 通过通信共享内存

    • 通过共享内存实现通信

      Go语言提倡通过通信共享内存。

      GO的协程间的通信都是在同一个进程内进行,所以没有必要跟进程间通信做比较,只需要跟线程间通信做比较即可。

  3. Channel

    • 构造方法:make(chan 元素类型,[缓冲大小])。定义缓冲大小为有缓冲通道、实现异步通信,否则为无缓冲通道、实现同步通信。
  4. 并发安全 Lock

    采用锁机制来保证同步和数据的安全性。

    // 声明锁
    var lock sync.Mutex
    // 获取锁
    lock.Lock()
    // 释放锁
    lock.Unlock()
    
  5. WaitGroup

    计数器,开启线程+1,执行结束-1。主线程阻塞,直到计数器为0。

    Add(delta int)  // +delta
    Done()          // -1
    Wait()          // 阻塞直到计数器为0
    
2.2 依赖管理
  1. GOPATH

    • 项目代码直接依赖src下的源码。使用go get下载最新的包到src
    • 弊端:无法实现package的多版本控制
  2. Go Vendor

    • 通过每个项目引入一份依赖的副本,解决多个项目需要同一个package依赖的冲突问题
    • 弊端:无法控制依赖的版本。更新项目可能会导致依赖冲突
  3. Go Module

    • 通过go.mod文件管理依赖包版本
    • 通过go get/go mod指令管理依赖包
2.3 系统测试

从单元测试到回归测试,覆盖率逐层变小,成本逐渐升高。

  1. 单元测试

    • 单元测试包括输入、测试单元、输出以及校对

    • 用最后的校对来保证代码的功能与预期相符

    • 可以保证质量,也可以提升效率

    1. 实际项目中,一般要求覆盖率在50%~60%,对于资金型要求可能达到80%
    2. 测试分支相互独立,全面覆盖
    3. 测试单元粒度足够小,函数单一职责
  2. Mock测试

    • 为一个函数/方法打桩
    • 摆脱本地文件的束缚和依赖
  3. 基准测试

    • 对一类测试对象的某项性能指标进行定量的和可对比的测试

3. 实战练习

  1. 需求分析

    • 展示话题和回帖列表
  2. 组件工具

    • Gin高性能go web框架
  3. Repository

    var (
        topicIndexMap map[int64]*Topic
        postIndexMap map[int64][]*Post
    )
    
    • 初始化话题数据索引
    • 根据查询key获得map中的value
  4. Service

    • 定义实体TopicPostList

      "参数校验" --> "准备数据" --> "组装实体"

    • 话题信息和回帖信息并行处理

  5. Controller

    • 构建View对象
    • 处理业务错误码
  6. Router

    • 初始化数据索引
    • 初始化引擎配置
    • 构建路由
    • 启动服务
  7. 运行

    • go run server.go运行测试