这是我参与「第五届青训营」伴学笔记创作活动的第2天。
一、语言进阶
并发VS并行
并发:多线程程序在一个核的cpu上运行
并行:多线程程序在多个核的cpu上运行
Goroutine(go中每一个并发执行的活动)
优势:成本和开销很小,每个Goroutine的栈堆只有几kb
使用:在函数或者方法前面加上关键字go
CSP:优先使用通信共享内存
Channel
(可以让一个Goroutine发送特定的值到另外一个Goroutine)
1、无缓冲通道
无缓冲通道上的发送操作会被阻塞,直到另一个Goroutine在对应通道上接收信息,完成传送,两个Goroutine继续执行。
声明:make(chan int)
2、有缓冲通道(添加一个缓冲区缓解通道阻塞)
声明:make(chan int,2)
并发安全Lock
1.sync.Mutex(互斥锁):只有一种锁:Lock()
2.sync.RWMutex(读写锁):有读锁(RLock)和写锁(WLock),当写锁阻塞时,新的读锁是无法申请的。
WaitGroup
1、add(delta int)->向内部计数器添加增量(delta)
2、Done()->减少WaitGroup计数器的值,在程序最后执行,相当于Add(-1)
3、Wait()->表示阻塞直到WaitGroup计数器为0
二、依赖管理
GOPATH
src:项目源代码
bin:可执行程序
pkg:第三方依赖库
运行:所有代码要求放在GOPATH/src目录下
Go Vendor
在每个项目目录下创建一个vendor目录,每个项目所需依赖都只会下载到自己vendor目录下
寻址方式:vendor=>GOPATH
Go Module
**通过go.mod文件管理依赖包版本**
go mod init->生成go.mod文件
go mod download-> 下载模块到本地缓存
go mod tidy->整理现有依赖
**通过go get/go mod指令工具管理依赖包**
go install=用来编译安装本地项目
go get=下载Go包+go install
三、测试
单元测试
规则
所有测试文件以_test.go结尾
func TestXxx(*testing.T)
初始化逻辑放到TestMain中
assert
使用库:github.com/stretchr/testify/assert
优势:定义了许多断言方法,不需要再传入Testing T参数