go语言进阶|青训营笔记

88 阅读2分钟

image.png


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


本文导航:

  • 语言进阶
  • 依赖管理
  • 测试

语言进阶

1.高并发

进程-->线程-->多线程-->协程

1)进程

描述的就是程序的执行过程,是运行着的程序的代表。

并发

进程的单个内核把cpu的执行时间切分成许多的时间片段,分配给不同的进程。例如,流水线的工作,工人就是cpu,不同的时间处理不同物品。

并行

多个cpu执行多个不同的进程

进程的缺点

一是内核的管理成本高,二是无法简单地通过内存同步数据,所以引入了多线程

2)线程

线程对应的英文名称为“thread”,它的功能是执行应用程序中的某个具体任务,比如一段程序、一个函数等。线程和进程之间的关系,类似于工厂和工人之间的关系,进程好比是工厂,线程就如同工厂中的工人。

多线程

一个进程中拥有多(≥2)个线程,线程之间相互协作、共同执行一个应用程序。

线程的缺点

线程内存占用,线程切换耗时

3)协程

协程就是用户态的线程。通常创建协程时,会从进程的堆中分配一段内存作为协程的栈

2.CSP(communicating sequential processes)并发模型

通信共享内存和共享内存实现通道

3.Channel(通道)

make(chan元素类型,[缓冲大小])

  • 无缓冲通道 make(chan int)
  • 有缓冲通道 make(chan int,2)

依赖管理

1.GOPATH

  • 环境变量$GOPATH
  • 项目代码直接依赖src下的代码
  • go get 下载最新版本的包到src目录下

弊病:无法实现package的多版本控制

2.GO Vendor

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

弊病:无法控制依赖的版本,更新项目又可能出现依赖冲突,导致编译出错。

3.Go Module

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

4.依赖管理三要素**

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

    • go.mod version indirect incompatible
    • 依赖图:选择最低的兼容版本
  • 中心仓库管理依赖库 Proxy

    • 回原,proxy,变量GOPROXY
  • 本地工具 go get/mod

    • go get

    image.png

    • go mod

    image.png

测试

单元测试

  • 单元测试-规则
    • 所有测试文件以_test.go 结尾
    • func TestXxx(*testing.T)
    • 初始化逻辑放到TestMain中
  • 单元测试-覆盖率
    • 一般覆盖率:50%~60%,较高覆盖率80%+。
    • 测试分支相互独立、全面覆盖。
    • 测试单元粒度足够小,函数单一职责。
  • 单元测试-Mock
    • 为一个函数
    • 为一个方法打桩

基准测试

  • 优化代码,需要对当前代码分析
  • 内置的测试框架提供了基准测试的能力