Go语言工程实践笔记 | 青训营笔记

74 阅读3分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第二篇笔记。

1 语言进阶 并发编程

并发:多线程在一个核,抢占时间片

并行:多线程在多核运行

1.1 Goroutine

线程:内核态

协程:用户态,轻量级线程,由go语言实现

通过go这一关键词来开启协程

1.2 CSP

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

image-20220513212828-62787kg.png

1.3 Channel

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

无缓冲通道 make(chan int)

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

用缓冲可以平衡生产/消费速度不均衡带来的问题

能保证顺序,是并发安全的

1.4 并发安全Lock

可以解决共享内存的运行安全

1.5 WaitGroup

由于time.sleep()的时间不确定引入,waitgroup相当于计数器

开启协程+1,结束协程-1,主协程阻塞直至计数器为0

image-20220513215027-kn6b036.png

2 依赖管理

2.1 依赖管理演进

不同项目依赖的库版本不同,控制依赖库的版本

演变:GOPATH->Go Vendor->GoModule

GOPATH-环境变量

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

弊端:无法实现多版本控制

Go Vender-项目目录文件夹

依赖寻址方式vendor->GOPATH

解决了多个项目需要同一个package的依赖冲突问题

弊端:无法控制依赖的版本

Go Module

通过go.mod文件管理依赖包版本

定义管理规则和管理项目依赖关系

Proxy-依赖分发

Go mod

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

GO111MODULE

GO111MODULE是 go modules 功能的开关。

GO111MODULE=off,无模块支持,go命令行将不会支持module功能,寻找依赖包的方式将会沿用旧版本那种通过vendor目录或者GOPATH模式来查找。
GO111MODULE=on,模块支持,go命令行会使用modules,而一点也不会去GOPATH目录下查找。
GO111MODULE=auto,默认值,go命令行将会根据当前目录来决定是否启用module功能。这种情况下可以分为两种情形:
(1)当前目录在GOPATH/src之外且该目录包含go.mod文件,开启模块支持。
(2)当前文件在包含go.mod文件的目录下面。

3 测试

回归测试->集成测试->单元测试

从上往下,从低覆盖到高覆盖,从高成本到低成本

3.1 单元测试

规则

测试文件以_test.go结尾

函数命名TestXxx(* testing.T)

运行

go test [flags] [packages]
go test hello_test.go hello.go

查看覆盖率

--cover
go test hello_test.go hello.go --cover

这个命令用来查看运行过的代码占所有代码的比例,以了解测试用例的覆盖率。

3.2 Mock测试

目的是为了去除外部依赖,如DB, file, cache等。

原理

使用打桩函数对原函数做替换,使得不再依赖外部文件。

3.3 基准测试

测试性能

规则

测试文件以_test.go结尾

函数命名BenchmarkXxx(* testing.B)