这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天。
一、本堂课重点内容:
本节课程主要分为四个方面:
- 并发编程
- 依赖管理
- 单元测试
- 项目实战
二、详细知识点介绍:
并发编程
- 协程Goroutine
- 通道Channel
- 锁Lock pkg.go.dev/sync
- 线程同步WaitGroup pkg.go.dev/sync
属于编程进阶内容,考虑到工程项目的可用性和可靠性,工程实践中经常会用到。
Go 程序中使用 go 关键字为一个函数创建一个 goroutine。一个函数可以被创建多个 goroutine,一个 goroutine 必定对应一个函数。
语法
为一个普通函数创建 goroutine 的写法如下:
go 函数名( 参数列表 )
-
函数名:要调用的函数名。
-
参数列表:调用函数需要传入的参数。
使用 go 关键字创建 goroutine 时,被调用函数的返回值会被忽略。
如果需要在 goroutine 中返回数据,请使用后面介绍的通道(channel)特性,通过通道把数据从 goroutine 中作为返回值传出。
所有 goroutine 在 main() 函数结束时会一同结束。
goroutine 虽然类似于线程概念,但是从调度性能上没有线程细致,而细致程度取决于 Go 程序的 goroutine 调度器的实现和运行环境。
终止 goroutine 的最好方法就是自然返回 goroutine 对应的函数。虽然可以用 golang.org/x/net/context 包进行 goroutine 生命期深度控制,但这种方法仍然处于内部试验阶段,并不是官方推荐的特性。
截止 Go 1.9 版本,暂时没有标准接口获取 goroutine 的 ID。
依赖管理
- Gopath
- Go Vendor
- Go Module : go.dev/blog/using-…
最早的时候,Go语言所依赖的所有的第三方库都放在 GOPATH 这个目录下面,这就导致了同一个库只能保存一个版本的代码。如果不同的项目依赖同一个第三方的库的不同版本,应该怎么解决?
go module 是Go语言从 1.11 版本之后官方推出的版本管理工具,并且从 Go1.13 版本开始,go module 成为了Go语言默认的依赖管理工具。
Modules 官方定义为:
Modules 是相关 Go 包的集合,是源代码交换和版本控制的单元。Go语言命令直接支持使用 Modules,包括记录和解析对其他模块的依赖性,Modules 替换旧的基于 GOPATH 的方法,来指定使用哪些源文件。
使用go get命令下载指定版本的依赖包
执行go get
命令,在下载依赖包的同时还可以指定依赖包的版本。
- 运行
go get -u
命令会将项目中的包升级到最新的次要版本或者修订版本; - 运行
go get -u=patch
命令会将项目中的包升级到最新的修订版本; - 运行
go get [包名]@[版本号]
命令会下载对应包的指定版本或者将对应包升级到指定的版本。
单元测试
- 单元测试概念和规则:go.dev/doc/tutoria…
- Mock测试:github.com/bouk/monkey
- 基准测试:pkg.go.dev/testing#hdr…
三、实践练习例子:
- 有什么实践举例帮助理解知识点?
操作系统的生产者和消费者模型比较适合作为并发引入,可以对照学习一下。
四、课后个人总结:
- 本章有什么知识点不容易掌握?
并发、协程自己一直掌握得不是很好,这次又重新学习了一下,感觉理解深刻了很多,还是看直接的项目学习的深刻一些。
-
什么地方容易与其他内容混淆?
- 协程与线程
- 并发与并行