这是我参与「第三届青训营 -后端场」笔记创作活动的的第2篇笔记。
本次笔记对应青训营第二节课:go语言工程实践。 课程主要内容有四个部分:go语言高并发编程,go语言依赖管理,go语言单元测试和项目实践。 本次笔记主要记录前两个部分,即go语言并发编程和依赖管理。
go并发编程
在go语言中,所有的并行操作都通过协程(goroutine)来完成。协程的使用例子如下:
import (
"fmt"
"time"
)
func hello(i int) {
println("hello goroutine : " + fmt.Sprint(i))
}
func HelloGoRoutine() {
for i := 0; i < 5; i++ {
go func(j int) {
hello(j)
}(i)
}
time.Sleep(time.Second)
}
复制代码
协程启动使用go关键字来完成。在实际运行中,多个协程(用户态)对应一个内核级线程,如图:
在go语言中,协程之间的同步有两种方式,一种是使用通道(channel),另一种是使用锁机制。两种方式的例子如下
通道:
func CalSquare() {
src := make(chan int)
dest := make(chan int, 3)
go func() {
defer close(src)
for i := 0; i < 10; i++ {
src <- i
}
}()
go func() {
defer close(dest)
for i := range src {
dest <- i * i
}
}()
for i := range dest {
//复杂操作
println(i)
}
}
复制代码
通道通过make关键字实现,有带缓冲区和不带缓冲区两种形式,当通道中无数据时,协程将会阻塞。通道实现协程的同步,实际上是相当于通过通道这一数据结构,实现了协程之间的通信。
锁:
`
`
go语言中标准库sync自带了锁功能,通过sync.Mutex进行调用。通过锁实现同步实际上是使用共享内存的方式。 通过互斥地访问同一块内存,进而实现同步。
依赖管理
go语言的依赖管理主要经历了以下几个版本的演进: gopath->vendor->go mod 笔记主要记录go mod的使用
go mod主要通过go.mod文件来进行项目的依赖包的版本管理,同时提供了相应的指令工具。 go mod的三要素分别是:go.mod文件,中心仓库proxy,以及go mod工具
在创建项目时,可以通过go mod init命令初始化生成go.mod文件以进行依赖管理。
go mod tidy命令可以为项目增加所需要的依赖,删除不必要的依赖:
\