go语言上手-工程实践 | 青训营笔记

82 阅读1分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第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关键字来完成。在实际运行中,多个协程(用户态)对应一个内核级线程,如图:

image.png

在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关键字实现,有带缓冲区和不带缓冲区两种形式,当通道中无数据时,协程将会阻塞。通道实现协程的同步,实际上是相当于通过通道这一数据结构,实现了协程之间的通信。

image.png

锁:

`

image.png`

go语言中标准库sync自带了锁功能,通过sync.Mutex进行调用。通过锁实现同步实际上是使用共享内存的方式。 通过互斥地访问同一块内存,进而实现同步。

image.png

依赖管理

go语言的依赖管理主要经历了以下几个版本的演进: gopath->vendor->go mod 笔记主要记录go mod的使用

go mod主要通过go.mod文件来进行项目的依赖包的版本管理,同时提供了相应的指令工具。 go mod的三要素分别是:go.mod文件,中心仓库proxy,以及go mod工具

在创建项目时,可以通过go mod init命令初始化生成go.mod文件以进行依赖管理。

image.png

image.pnggo mod tidy命令可以为项目增加所需要的依赖,删除不必要的依赖:

image.png

\