Go语言进阶与依赖管理 | 青训营笔记

174 阅读3分钟

这是我参与「第五届青训营」伴学笔记创作活动的第 2 天

一、本堂课重点内容:

  • Go语言进阶:从并发编程的视角了解Go高性能的本质
  • 依赖管理:了解Go语言依赖管理的演进路线
  • 测试:从单元测试出发,提升质量意识
  • 项目实战:通过项目需求、需求拆解、逻辑设计、代码实现感受真实的项目开发

二、详细知识点介绍:

    1. 并发和并行:
    • 1.1 Goroutine 协程: 充分发挥多核优势,高效运行
      • 协程:用户态,轻量级线程,栈MB级别
      • 线程:内核态,线程跑多个协程,栈KB级别
    • 1.2 CSP(Communicating Sequential Processes):
      • 提倡通信共享内存而不是通过共享内存而实现通信
    • 1.3 Channel 通道
      • make(chan元素类型,[缓冲大小])
        • 无缓冲通道 make(chan int)
        • 有缓冲通道 make(chan int,2)
    • 1.4 并发安全 Lock
    • 1.5 WaitGroup
      • Add(delta int) 计数器+delta;
      • Done() 计数器-1;
      • Wait() 阻塞直到计数器为0
  • 2.依赖管理

    • 2.1 背景
      • 工程项目不可能基于标准库0~1编码搭建
      • 管理依赖库
    • 2.2 依赖管理演进
      • GOPATH
        • 环境变量$GOPATH
        • 项目代码直接依赖src下的代码
        • go get下载最新版本的包到src目录下
        • 弊端:无法实现package的多版本控制
      • Go Vendor
        • 项目目录下增加vendor文件,所有依赖包副本形式放在$ProjectRoot/vendor
        • 依赖寻址方式:vendor => GOPATH
        • 通过每个项目引入一份依赖的副本,解决了多个项目需要同一个package依赖的冲突问题
        • 弊端:无法控制依赖的版本;更新项目有可能出现依赖冲突
      • Go Module(广泛应用)
        • 通过go.mod文件管理依赖包版本
        • 通过go get/go mod指令工具管理依赖包
        • 终极目标:定义版本规则和管理项目依赖关系
        • 依赖管理三要素
          • 配置文件,描述依赖 go.mod
          • 中心仓库管理依赖库 Proxy
          • 本地工具 go get/mod
    • 2.3 Go Module实践
  • 3.测试

    • 单元测试
      • 规则
        • 测试文件以_test.go结尾
        • func TestXxx(*testing.T)
        • 初始化逻辑放到TestMain中
      • 例子
      • 运行
      • assert
      • 覆盖率
        • 一般覆盖率50-60%,较高覆盖率80%
        • 测试分支相对独立、全面覆盖
        • 测试单元粒度足够小,函数单一职责
    • Mock测试
    • 基准测试
      • 优化代码,需要对当前代码分析
      • 内置的测试框架提供了基准测试的能力
  • 4.项目实战

    • 需求描述
      • 展示话题和回帖列表
      • 暂不考虑前端页面实现,仅仅实现本地web服务
      • 话题和回帖数据用文件存储
    • 代码实现
      • E-R图
        • Topic
          • id
          • title
          • content
          • create_time
        • Post
          • id
          • topic_id
          • content
          • create_time
      • 分层结构
        • 数据层:数据Model,外部数据的增删改查
        • 逻辑层:业务Entity,处理核心业务逻辑输出
        • 视图层:视图view,处理和外部的交互逻辑
      • 组件工具 - Gin高性能 go web框架
      • Router
        • 主函数
          • 初始化数据索引
          • 初始化引擎配置
          • 构建路由
          • 启动服务
    • 运行测试
      • go run server.go

三、课后个人总结:

  • 好好学习 天天向上