Go语言进阶 | 青训营笔记

54 阅读2分钟

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

课程内容

  • 并发编程 协程、通道、线程同步
  • 依赖管理 Go Module
  • 单元测试 单元测试、Mock测试与基准测试
  • 项目实战 青训营话题页的简单模拟开发

并发编程

并发:多线程程序在一个核的 CPU 上运行

并行:多线程程序在多个核的 CPU 上运行

协程:用户态、轻量级线程,栈 MB 级别

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

CSP:提倡通过通信共享内存而非通过共享内存实现通信

Channel

    makechan int)\\无缓冲通道 
    makechan int2)\\有缓冲通道

lock:lock.Lock(),lock.Unlock()

waitgroup:开启协程用Add()【计数器增加若干】,协程执行结束用Done()【计数器-1】,阻塞用Wait()【等待计数器为0】

依赖管理

Go依赖管理演进:

  • GoPath 无法实现package的多版本控制
  • GoVender 无法控制依赖的版本。更新项目又可能出现依赖冲突,导致编译出错。
  • GoModule 可以定义规则管理关系。

三要素:

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

go.mod:

【version】语义化版本${MAJOR}.${MINOR}.${PATCH}

基于commit伪版本vX.0.O-yyyymmddhhmmss-abcdefgh1234(时间戳+随机哈希码)

【关键词】indirect表示非直接依赖

对于没有go.mod且主版本在2以上的添加+incompatible

【编译时选择最低兼容版本】

本地工具:

【go get】

  • @update 默认
  • @none 删除依赖
  • @v1.1.2 tag版本,语义版本
  • @23dfdd5 特定的commit
  • @master 分支的最新commit

【go mod】

  • init 初始化,创建go.mod文件

  • download 下载模块到本地缓存

  • tidy 增加需要的依赖,删除不需要的依赖

单元测试

单元测试:

所有测试文件以_test.go 结尾

func TestXxx(*testing.T)

初始化逻辑放到TestMain中

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

项目实战

分层结构:

  • 数据层:数据Model,外膜数据的CRUD
  • 逻辑层:业务Entity,处理核心业务逻辑输出
  • 视图层:视图View,处理和外部的交互逻辑

总结

自我感觉go的部分工程知识,与Java的相关想法都是类似的,存在Maven类似的管理仓库,有MVC的开发思路,也有框架的快速搭建来方便开发。