Golang进阶 为大项目铺路 | 青训营笔记

102 阅读3分钟

Golang进阶 为大项目铺路 | 青训营笔记

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

· 并发编程

并发与并行:

并发指的是多个程序在单核CPU上的运行,主要是通过时间片轮转实现多线程程序的运行 并行是利用了多核实现了多线程的同时运行 go语言实现了一个高性能的并发调度模型,能充分发挥多核计算机的优势,可以说go语言就是为并发而生的。

协程:

协程是go语言的运行机制中的一个重要概念,协程是轻量级的执行线程,一个线程中可以运行多个协程。在go语言中开启协程的方式非常简单,只需要在函数前面加上“go”关键字即可开启一个协程 例如下面这段代码。

    go func(j int) {
            defer wg.Done()
            hello(j)
    }(i)

通道:

通道是链接多个协程的管道。你可以从一个协程将值发送到通道,然后在另一个协程中接收。go语言提倡通过 通信共享内存,而不是通过共享内存来实现通信。使用 make(chan val-type) 创建一个新的通道。 通道类型就是他们需要传递值的类型。 默认情况下,通道是 无缓冲 的,这意味着只有对应的接收(<- chan) 通道准备好接收时,才允许进行发送(chan <-)。 有缓冲通道 允许在没有对应接收者的情况下,缓存一定数量的值。

package concurrence

func CalSquare() {
	// 创建无缓冲通道
	src := make(chan int)
	// 创建有缓冲通道
	dest := make(chan int, 3)

	/*
		A协程,遍历1-10的值,将1-9的数字发送至src这个Channel
	*/
	go func() {
		defer close(src)
		for i := 0; i < 10; i++ {
			src <- i
		}
	}()
	/*
		B协程,遍历src中的值,并计算出src中的每个值的平方,求得的平方发送至dest这个Channel
	*/
	go func() {
		defer close(dest)
		for i := range src {
			dest <- i * i
		}
	}()
	for i := range dest {
		println(i)
	}
}

并发安全Lock:

为了防止多个goroutine同时操作导致结果与预期不符,所以需要添加并发安全锁来防止这种情况的发生。下面是一个例子,这个例子使用了五个协程并发执行2000次+1操作

image.png 如图所示,不加锁就会导致并发执行的程序结果不符合预期。

WaitGroup:

想要等待多个协程完成,我们可以使用 wait group实现该效果

· 依赖管理

为什么要用到依赖管理?

对于实际的业务来说,我们不可能仅仅只用go语言自带的标准库编写业务。这样的效率太低了,要学会站在巨人的肩膀上。也就是说实际开发中会使用许多的第三方库来提升我们的编码效率。然而这些依赖库来自不同站点的不同存储库,拥有不同的版本;这些依赖库本身也拥有许多依赖...... 这些事情总能使得每一位程序员焦头烂额。为了解决依赖的管理问题,Go 引入了依赖管理。

Golang依赖管理的历史

Golang的依赖管理发展到现在一共经历了三个阶段 分别是GOPATH,GO Vender和Go Module。现在使用的依赖管理模式是Go Module

Go Module

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

·引用

Go by Example 中文版

字节内部课 · Go 语言进阶与依赖管理