Go语言进阶 | 青训营笔记

56 阅读2分钟

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

Go语言入门 - 工程实践

并发编程

01.并发 vs 并行

image.png

1.1 Goroutine

image.png 协程是Go中的特殊"线程",轻量级的。栈KB级别。 要想开启一个协程,只需要在前面加上一个go就可以了,如下。

func HelloGoRoutine() {
	for i := 0; i < 5; i++ {
		go func(j int) {
			hello(j)
		}(i)
	}
	time.Sleep(time.Second)
}
1.2 CSP

image.png

1.3 Channel

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

无缓冲通道 -> make(chan int) -> 保持同步,同步通道

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

image.png

生产者与消费者问题中,若生产者采用了无缓冲通道,那么消费者可以采用有缓冲通道来跟上生产者的速度。

1.4 并发安全 Lock

就是锁,用法同Java中的差不多。

1.5 WaitGroup

它有三个方法:

Add(delta int):计数器 + delta

Done:计数器 - 1

Wait:阻塞直到计数器为0

用来控制协程的结束,实际上这和信号量的思想一致,只不过这里是可以加delta自定义的数量,而信号量只能增一减一。

依赖管理

02.背景

其实和Java中的Maven一样,单靠原生库并不一定能够应对各种复杂的场景,为此将别人开发的好的可用的组件拿来用。

2.1 依赖管理演进

GOPATH -> Go Vendor -> Go Moudle

一定要注意版本问题!

image.png

GOPATH弊端:本地有多个项目都用同一个src,但是不同项目所要使用的源码版本不一致。

Vendor:就是多了一个文件夹,放一个副本,比如有一个func,A要1.0版本的,B要2.0版本的,若用GOPATH则不行,但用Vendor就可以将1.0复制一个副本放在文件夹,另一个2.0的直接在GOPATH中。这样不行,若版本更新了,如2.0 -> 3.0,那么2.0占用1.0,可是有项目要用1.0怎么办?

Go Moudle:和Maven大同小异,go.mod就是pom文件,Proxy就是Maven本地库,go get/mod 就是往Maven中写入依赖信息导入。//indirecr就相当于Maven中的标记灰色即不启用。选择最低的兼容版本。

image.png

Proxy解决依赖分发问题。

2.2 工具

image.png

image.png

单元测试

03. 测试

image.png

3.1 单元测试

image.png

规则

image.png

单元测试-覆盖率 image.png

Mock理解为代理模式 摆了。

项目实战