01.并发VS并行
GO可以充分发挥多核优势,高效运行。
1.1.Gouroutine
协程:用户态,轻量级线程,栈kb级别;
线程:内核态,线程跑多个协程,栈mb级别;
协程的创建和调度由GO语言本身完成,比线程要轻量很多。
GO语言中开启一个协程只需要在调用函数时在前面加go关键字。
1.2.CSP
提倡通过信息共享内存而不是通过共享内存而实现通信。
1.3.Channel
make(chan 元素类型,[缓冲大小])
无缓冲通道 make(chan int)
有缓冲通道 make(chan int,2)
无缓冲通道也被称为同步通道
解决同步问题就是设置缓冲区
1.4.并发安全Lock
对临界区的权限控制来保证并发安全
1.5.WaitGroup
Add (delta int) 计数器+delta
Done() 计数器-1
Wait() 阻塞直到计数器为0
02.依赖管理
背景 工程项目不可能基于编制库0~1编码搭建
管理依赖库
2.1GO依赖管理演进
不同环境(项目)依赖的版本不同
控制依赖库的版本
2.1.1GOPATH
项目代码直接依赖src下的代码
go get下载最新版本的包到src目录下
2.1.1GOPATH的弊端
无法实现package的多版本控制
2.1.2GO Vendor
通过每个项目引入一份依赖的副本,解决了多个项目需要同一个package依赖的冲突问题。
2.1.2GO Vendor的弊端
无法控制依赖的版本
更新项目又可能出现依赖冲突,导致编译出错。
2.1.3Go Module
通过go.mod文件管理依赖包版本
通过go get/go mod指令工具管理依赖包
2.2依赖管理三要素
1.配置文件,管理依赖 go.mod
2.中心仓库管理依赖库 Proxy
3.本地工具 go get/mod
03.测试
回归测试 -> 集成测试->单元测试
从上到下,覆盖率逐层变大,成本却逐层降低
单元测试的规则
所有的测试文件要以_test.go结尾
func Test xxx(*testing.T)
初始化逻辑放到TestMain中
在运行代码时,如果根目录有多个文件夹且每个文件里都有go.mod文件。这时就需要在根目录中设置go.work文件来保证两个go.mod文件都可以工作。