语言进阶+依赖管理+测试| 青训营笔记

55 阅读2分钟

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

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

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

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

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

Channel

  • make(chan 元素类型,缓冲大小])
  • 无缓冲通道 make(chan int)
  • 有缓冲通道 make(chan int,2)

WaitGroup

  • Add(delta int) 计数器+delta
  • Done() 计数器-1
  • Wait() 阻塞直到计数器为0

计数器

  • 开启协程+1;

  • 执行结束-1;

  • 主协程阻塞直到计数器为0.

  • bin 项目编译的二进制文件

  • pkg 项目编译的中间产物,加速编译

  • src 项目源码

  • 项目代码直接依赖 src下的代码

  • go get 下载最新版本的包到 src 目录下

Go Vendor

项目目录下增加 vendor 文件,所有依赖包副本形式放在 $ProjectRoot/vendor 依赖寻址方式: vendor => GOPATH

通过每个项目引入一份依赖的副本 解决了多个项目需要同一个 package 依赖的冲突问题

Go Module

  • 通过 go.mod 文件管理依赖包版本
  • 通过 go get/go mod 指令工具管理依赖包

依赖管理三要素

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

go get example.org/pkg

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

go mod

  • init 初始化,创建go.mod文件
  • download 下载模块到本地缓存
  • tidy 增加需要的依赖,删除不需要的依赖

测试

单元测试

  • 所有测试文件以test.go 结尾
  • func TestXxx(*testing.T)
  • 初始化逻辑放到 TestMain 中
  • github.com/stretchr/testify/assert"

单元测试-Tips

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

单元测试- Mock

monkey : github.com/bouk/monkey

快速 Mock 函数

  • 为一个函数打桩

  • 为一个方法打桩

  • monkey.Patch(ReadFirstLine, func( string {return "line110“})

    对 ReadFirstLine 打桩测试,不再依赖本地文件

基准测试

  • 需要对当前代码分析优化代码,

  • 内置的测试框架提供了基准测试的能力