go语言进阶|青训营笔记
这是我参与「第五届青训营」笔记创作活动的第二天 项目和作业实现了一下,但是主要是逻辑和细节上的问题,不在知识点部分总结。
- 1.并发编程
-
1.0并发与并行
并发:多线程程序在单核cpu的运行
并行:多线程程序在多核cpu上运行 -
1.1Goroutine //协程
协程:用户态,轻量级线程,栈KB级别
线程:内核态,线程跑多个协程,MB级别
-
线程 线程 内核态
协程 协程 协程 协程 协程 用户态
协程的创建
go func(){
代码体}()
-
1.2 CSP 通信共享内存
-
-
1.3 channel
定义:make(chan 元素类型,[缓冲大小])- 无缓冲通道
make(chan int)//同步通道,接受与发送同步 当面收 - 有缓冲通道
make(chan int,2)//通道容量即可存放的数据量 类似快递柜的格子 - eg: 实现顺序性
-
1.4 并发安全lock 共享内存实现通信
- sync.MUtex库
- 使用时先声明 var lock sync.Mutex
- 利用lock.lock()对临界区进行占用
- 利用lock.Unlock()解除占用实现运行保护
-
1.5 WaitGroup
- 定义 var wg WaitGtoup
- 方法
- Add(a int) 计数器+a 开启a个并发
- Done() 计数器-1
- Wait() 阻塞直到计数器为0
-
- 依赖管理 Module
- 2.1 Go依赖管理演进
- GOPATH->Go Vendor->Go Module
- 不同项目依赖版本不同
- 控制依赖库的版本
- 2.1.1 GOPATH
- 项目代码依赖src代码
- go get下载最新版本包到src目录
- 缺点:无法实现package的多版本控制
- 2.1.2 GO Vendor
- 项目目录下增加vendor文件 所有依赖包副本存放在vendor中
- 依赖寻址方式 vendor =>GoPATH
- 解决了多个项目需要同一个package依赖的冲突问题
- 缺陷:无法控制依赖版本&&更新项目出现依赖冲突
- 2.1.3 Go Module
- 通过go.mod 文件管理依赖包版本
- 通过 go get/go mod 指令工具管理依赖包
- 2.1.2 GO Vendor
- 2.2 依赖管理三要素
- 2.2.1 配置文件,描述依赖 go.mod
- 2.2.2 中心仓库管理依赖库 Proxy
- 2.2.3 本地工具 go get/go mod
-
2.3 依赖配置
- 依赖配置-go.mod
-
详细见图
- 依赖配置 -version
- 语义化版本
{MAJOR}.${MINOR}.${PATCH} //MAJOR 大版本之间可不兼容,MINOR 增加函数和功能 PATCH 补丁 - 基于commit伪版本
- 版本前缀-时间戳-12位hash前缀
- 语义化版本
- 依赖配置 -indirect
- A->B->C A->B直接依赖 A->C间接依赖 用indirect 标识
- 依赖配置- incompatible
- 没有go.mod 版本文件并且主版本2+的依赖 +incompatible
- 依赖配置 -version
因为 v1.3 v1.4 MAJOR=1相互兼容选择1.4
-
2.3.5 依赖分发-回源(略)
-
2.3.6 变量GOPROXY(略)
-
2.3.7 go get
go get example.org/pkg
-@update 默认
-@none 删除依赖
-@v1.1.2 tag版本,语义版本
-@23dfdd5 特定的commit
-@master 分支的最新commit
go mod
- init 初始化 创建go.mod文件
- download 下载模块到本地缓存
- tidy 增加需要的依赖,删除不需要的依赖
-
- 测试
- 单元测试
- 要素:输入,测试单元,输出,期望
- 保证质量,提升效率
- 规则
- 测试文件均以 _test.go结尾
- func TestXxx(*testing.T)
- 初始化逻辑放到TestMain中 func TestMain(t *testing.M)
- 测试命令 test ./TestXxx.fo Xxx.fo
- 例子 //测试实现与assert包
func HelloTom() string { return "Tom" } func TestHelloTom(t *testing.T) { output := HelloTom() expectOutput := "Tom" assert.Equal(t, expectOutput, output) }- 覆盖率:测试项目覆盖的原文件的代码比例
- go test TestXxx.fo Xxx.fo --cover //求覆盖率
- 测试依赖
- 幂等->多测测试结果相同
- 稳定->各中环境均可实现,不依赖环境
- 若测试文件被删则无法实现不稳定
- Mock
- 为一个函数或者方法打桩 //用函数B替代函数A(原函数)
- monkey包
- 要素:输入,测试单元,输出,期望
- 基准测试(没有太明白) go test -bench=. [-- run=函数名] 测试文件 目标测试文件 //测试命令
注意在windows环境下 go test -bench="." [-- run=函数名] 测试文件 目标测试文件 才能执行
标题:Go 语言进阶与依赖管理 - 掘金