go语言学习2 | 青训营笔记

57 阅读1分钟

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

go语言工程实践

1 语言进阶

并发

1.协程:用户态,轻量级线程,栈MB级别。

创建方法:前面加go关键字

如:

go say("hello") //添加了协程

注意:提倡通过通信共享内存而不是通过共享内存而实现通信。

即用通道而不是临界区。通道相当于一个队列,先进先出,能保证数据发送的顺序。

2.channel

无缓冲通道:make(chan int)

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

无缓冲通道也被称为同步通道。解决同步问题则是设置一个能存放多个元素的有缓冲通道。

将值发送到通道代码块需要使用<-运算符:

goroutine1 := make(chan string,5)
goroutine1 <- "hello"

3.计数器

可以有效避免死锁。

开启协程+1,执行结束-1,主协程阻塞直到计数器为0。

4.WaitGroup

实现同步,防止子协程还没运行完,主协程就运行完。

2 依赖管理

指利用其他人已经开发好的组件和工具。

1.环境变量GOPATH

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

go get下载最新版本的包到src目录下

问题:无法实现package的多版本控制

2.Go Vender

项目目录下增加vendor文件,所有依赖包副本形式放在$ProjectRoot/vendor

依赖寻址方式:vendor =>GOPATH

通过每个项目引入一份依赖的副本,解决了多个项目需要同一个package依赖的冲突问题。

弊端:版本之间可能不兼容,无法控制依赖的版本,更新项目又可能出现依赖冲突。

3.Go Module

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

通过go get/go mod指令工具管理依赖包。

目标:定义版本规则和管理项目依赖关系。

依赖管理三要素:

配置文件,描述依赖:go.mod

中心仓库管理依赖库:Proxy

本地工具:go get/mod