工程时间|青训营笔记

81 阅读2分钟

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

一、语言进阶

并发VS并行

并发:多线程程序在一个核的cpu上运行

并行:多线程程序在多个核的cpu上运行

Goroutine(go中每一个并发执行的活动)

优势:成本和开销很小,每个Goroutine的栈堆只有几kb
使用:在函数或者方法前面加上关键字go

CSP:优先使用通信共享内存

Channel

(可以让一个Goroutine发送特定的值到另外一个Goroutine)

1、无缓冲通道

  无缓冲通道上的发送操作会被阻塞,直到另一个Goroutine在对应通道上接收信息,完成传送,两个Goroutine继续执行。
  声明:makechan int

2、有缓冲通道(添加一个缓冲区缓解通道阻塞)

   声明:makechan int2

并发安全Lock

1.sync.Mutex(互斥锁):只有一种锁:Lock()
2.sync.RWMutex(读写锁):有读锁(RLock)和写锁(WLock),当写锁阻塞时,新的读锁是无法申请的。

WaitGroup

1add(delta int)->向内部计数器添加增量(delta)
2Done()->减少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参数