工程提升 | 青训营笔记

37 阅读3分钟

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

一、本堂课重点内容:

本节课程主要分为四个方面:

  1. 并发编程
  2. 依赖管理
  3. 单元测试
  4. 项目实战

二、详细知识点介绍:

并发编程

属于编程进阶内容,考虑到工程项目的可用性和可靠性,工程实践中经常会用到。

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。

依赖管理

最早的时候,Go语言所依赖的所有的第三方库都放在 GOPATH 这个目录下面,这就导致了同一个库只能保存一个版本的代码。如果不同的项目依赖同一个第三方的库的不同版本,应该怎么解决?

go module 是Go语言从 1.11 版本之后官方推出的版本管理工具,并且从 Go1.13 版本开始,go module 成为了Go语言默认的依赖管理工具。

Modules 官方定义为:

Modules 是相关 Go 包的集合,是源代码交换和版本控制的单元。Go语言命令直接支持使用 Modules,包括记录和解析对其他模块的依赖性,Modules 替换旧的基于 GOPATH 的方法,来指定使用哪些源文件。

image.png

使用go get命令下载指定版本的依赖包

执行go get 命令,在下载依赖包的同时还可以指定依赖包的版本。

  • 运行go get -u命令会将项目中的包升级到最新的次要版本或者修订版本;
  • 运行go get -u=patch命令会将项目中的包升级到最新的修订版本;
  • 运行go get [包名]@[版本号]命令会下载对应包的指定版本或者将对应包升级到指定的版本。

单元测试

三、实践练习例子:

  • 有什么实践举例帮助理解知识点?

操作系统的生产者和消费者模型比较适合作为并发引入,可以对照学习一下。

四、课后个人总结:

  • 本章有什么知识点不容易掌握?

并发、协程自己一直掌握得不是很好,这次又重新学习了一下,感觉理解深刻了很多,还是看直接的项目学习的深刻一些。

  • 什么地方容易与其他内容混淆?

    • 协程与线程
    • 并发与并行

五、引用参考: