这是我参与「第三届青训营 -后端场」笔记创作活动的第二篇笔记
Go 语言进阶
CSP模型
CSP模型是由协程Goroutine与通道Channel实现
协程goroutine
goroutine 是 Go语言中的轻量级线程实现,由 Go 运行时(runtime)管理。Go 程序会智能地将 goroutine 中的任务合理地分配给每个 CPU。Go 程序就会为 main() 函数创建一个默认的 goroutine。
- 使用普通函数创建 goroutine Go 程序中使用 go 关键字为一个函数创建一个 goroutine。一个函数可以被创建多个 goroutine,一个 goroutine 必定对应一个函数。 go 函数名( 参数列表 )
- 函数名:要调用的函数名。
- 参数列表:调用函数需要传入的参数。 使用 go 关键字创建 goroutine 时,被调用函数的返回值会被忽略。如果需要在 goroutine 中返回数据,请使用后面介绍的通道(channel)特性,通过通道把数据从 goroutine 中作为返回值传出。
func running() {}
func main() {
// 并发执行程序
go running()
}
- 使用匿名函数创建goroutine go 关键字后也可以为匿名函数或闭包启动 goroutine。 使用匿名函数或闭包创建 goroutine 时,除了将函数定义部分写在 go 的后面之外,还需要加上匿名函数的调用参数,格式如下:
go func( 参数列表 ){
函数体
}( 调用参数列表 )
其中:
- 参数列表:函数体内的参数变量列表。
- 函数体:匿名函数的代码。
- 调用参数列表:启动 goroutine 时,需要向匿名函数传递的调用参数。
channel
Channel 是在多个 goroutine 之间传递数据和同步的重要手段。声明 channel 的语法如下:
chan T // 声明一个双向通道
chan<- T // 声明一个只能用于发送的通道
<-chan T // 声明一个只能用于接收的通道COPY
make (chan int) //无缓冲,同步
make (chan int, 2) //有缓冲,异步
并发安全Lock
lock sync.Mutex //互斥锁
lock.Lock() //加锁
loc.Unlock() //解锁
//加锁后在加锁会进入阻塞,只能等第一个锁解开口再加
WaitGroup
等待组可以保证在并发环境中完成指定数量的任务。
(wg * WaitGroup) Add(delta int) //等待组的计数器 +1
(wg * WaitGroup) Done() //等待组的计数器 -1
(wg * WaitGroup) Wait() //当等待组计数器不等于 0 时阻塞 直到变为 0。
依赖管理
GOPATH->Go Vendor->Go Module go.mod里的 //indirect表示间接依赖 +incompatible //不规范依赖
# 安装以来
go get
go mod init #初始化,创建go.mod文件
download # 下载模块到本地缓存
tidy # 增加需要的依赖,删除不需要的依赖
测试
单元测试-规则
- 测试文件以_test.go结尾
- func TestXxx(*testing.T)
- 初始化逻辑到TestMain中
覆盖率
//待测函数
func JudgePassLine(score int16) bool {
if score >= 60 {
return true
}
}
//测试覆盖率
func TestJudgePassLine(t *testing.T) {
isPass := JudgePassLine(70)
assert.Equal(t, true, isPass)
}
Mock
代替一个函数或者文件
结束语
Go的并发性能很强,得益于协程的帮助。go module了解知识了。测试这块以前软件测试学过,不写太多了。