GO语言进阶 | 青训营笔记

168 阅读2分钟

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

一、语言进阶

  1. go语言主要使用协程来提升并发性能
  2. 通过channel实现通过通信共享内存
  3. 无缓冲的通道会导致发送的gorountine和接收的gorountine同步化,因此无缓冲通道也被称为同步通道
  4. 解决方法就是有缓冲通道,带缓冲的channel可以解决生产和消费速度不均衡带来的执行效率问题
  5. 并发安全:sync.Mutex
  6. 优雅的退出:add done wait

二、依赖管理

go module

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

依赖管理三要素:

  1. 配置文件,描述依赖 go.mod

    • go mod文件内的关键字:

      • module语句指定当前模块的名字(路径)
      • require语句指定的依赖项模块 就是当前模块依赖的模块
    • go get用于拉取新的依赖

      • go get [module-path]@latest 拉取最新的版本(优先择取 tag)
      • go get [module-path]@master 拉取 master 分支的最新 commit
      • go get -u 更新所有依赖
    • go mod

      • go mod download 下载 go.mod 文件内的所有依赖
      • go mod tidy 整理现有依赖
      • go mod init [module-path] 生成 go.mod
  2. 中心仓库管理依赖库 proxy

  3. 本地工具 go get/go mod

版本:MAJOR.{MAJOR}.{MINOR}.${PATCH}

不同的MAJOR 版本表示是不兼容的 API,所以即使是同一个库,MAJOR 版本不同,也会被认为是不同的模块;

MINOR版本通常是新增函数或功能,向后兼容

PATCH一般为修复bug

测试

单元测试

  • 所有测试文件以xxx_test.go 结尾
  • func TestXxx(t *testing.T)
  • 初始化逻辑放到 TestMain 中

运行:go test [flags][packages]

MOCK:

Monkey开源库

Monkey Patch 的作用域在 Runtime,在运行时通过通过 Go 的unsafe 包,能够将内存中函数的地址替换为运行时函数的地址将待打桩函数或方法的实现跳转到。

基准测试

Go 语言还提供了基准测试框架,基准测试是指测试一段程序的运行性能及耗费 CPU 的程度

func BenchmarkXxxx(b *testing.B){
}

一个高性能随机数方法fastrand:因为rand为了保证全局的随机性和并发安全,持有了一把全局锁,这样导致性能下降