Go语言进阶
这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天。
-
线程与协程Goroutine
- 在子函数前加一个go关键字,go func(){}()
- defer close()延迟的资源关闭
-
CSP,携程之间的通信,通过通信共享内存而不是通过共享内存实现通信
-
Channel通道,无缓冲/有缓冲通道,make(chan元素类型,[缓冲大小])
-
并发安全lock
-
WaitGroup
Go依赖(写好的开发包)管理
-
GOPATH、GoVendor、GoModule
1.GOPATH(bin、pkg、src)项目代码直接依赖src下的代码。go get下载最新版本的包到src目录下。弊端:无法实现package的多版本控制。 2.GoVendor,项目目录下增加vendor文件夹,存放依赖包副本。弊端:无法控制依赖的版本,依赖冲突、编译出错。 3.GoModule,go.mod文件管理依赖包版本、go get/go mod指令工具管理依赖包。
-
依赖管理三要素
- 配置文件,描述依赖 go.mod
- 中心仓库管理依赖库 Proxy
- 本地工具 go get/mod
-
依赖配置-version、indirect、incompatible
- 语义化版本
- 基于commit伪版本
-
依赖图
-
依赖分发
- 回源
- Proxy
- 变量GOPROXY
-
工具
- go get
- go mod(init、download、tidy)
Go测试
- 回归测试
- 集成测试
- 单元测试,单元测试主要包括,输入,测过单元输出,以及校对,单元的概念比较广,包括接口,函数,模块等:用最后的校对来保证代码的功能与我们的预期相,单侧一方面可以保证质量,在整体覆盖率足够的情况下,一定程度上既保证了新功能本身的正确性,又未破坏原有代码的正确性,另一方面可以提升效率,在代有bg的情况下,通过编写单测,可以在一个较短周期内定位和修复问题。
- 规则
- 测试文件以_test.go结尾
- 测试函数命名func TestXxx(*testing.T)
- 初始化逻辑放到TestMain中
- 覆盖率 go test *.go --cover,一般要50%-60%,较高80%+
- 依赖:外部依赖=>稳定&幂等
- 文件处理
- 规则
- Mock测试打桩,monkey
- 基准测试