Go语言进阶-工程进阶| 青训营笔记

123 阅读2分钟

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

协程:

协程与进程区别

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

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

使用:

go使用go关键字开启一个协程

csp:

并发提倡通过通信共享内存而非 通过共享内存实现通信

image.png

channel

channel实质上是一个循环队列 有两种初始化: 有缓冲区:make(chan int,n),n代表多少个缓冲区 无缓冲区:make(chan int,0) 当没有缓冲区时channel里面就不能有额外空间存放数据,因此当一个数据放入管道中,必须有数据接收管道里的数据,该进程才会继续向下运行,否则则会一直阻塞。

并发安全lock

go中sync中包中含有读锁和写锁对并发进行安全限制,锁的使用往往对一行操作进行锁操作。而go中对并发安全进行加锁的方式主要用sync包中的Mutex,RWMutex,WaitGroup,Once,Map这几个api进行操作

func (m *Mutex) Lock()	        获取互斥锁 
func (m *Mutex) Unlock()	释放互斥锁

func (rw *RWMutex) Lock()	获取写锁
 func (rw *RWMutex) Unlock()	释放写锁 

func (rw *RWMutex) RLock()	获取读锁 
func (rw *RWMutex) RUnlock()	释放读锁

 func (rw *RWMutex) RLocker() Locker	返回一个实现Locker接口的读写锁
 
func (wg * WaitGroup) Add(delta int)	计数器+1
func (wg *WaitGroup) Done() 计数器-1 
func (wg *WaitGroup) Wait()	阻塞直到计数器变为0

...

go依赖管理

gopath

bin:项目编译的二进制文件
pkg:项目编译的中间产物,加速编译
src:项目源码

go vender

  • 项目目录下增加vendor文件,所有依赖包副本形式放在$ProjectRoot/vendor

  • 依赖寻址方式: vendor => GOPATH

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

  • 弊端:

image.png

go Module

  • 通过go.mod文件管理依赖包
  • 通过go get/go mod 指令工具管理依赖包
  • 目标:定义版本规则和管理项目依赖关系

依赖管理三要素:

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

工具:

  • go get

image.png

  • go mod

image.png

测试:

单元测试:

图解:

image.png

规则:

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

image.png

  • func Testxxx(*testing.T)

image.png

  • 初始化逻辑放在TestMain中

image.png

示例:

image.png

assert

用于纠正错误

代码覆盖率

用于评估项目的测试水准

image.png 用大量测试用例覆盖测试函数的各种情况


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

依赖

  • 幂等
  • 稳定

文件处理示例:

image.png

Mock 为函数打桩

基准测试:

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

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