Go 语言进阶与依赖管理
01.语言进阶
从并发编程的视角带大家了解Go高性能的本质
1.1 Goroutine
协程: 用户态, 轻量级线程, 栈 KB 级别
线程: 内核态, 线程跑多个协程, 栈 MB级别
Go语言调用协程十分简单, 只需要在函数前加上 go
package main
import (
"fmt"
"time"
)
func hello(i int) {
println("hello goroutine : " + fmt.Sprint(i))
}
func main() {
for i := 0; i < 5; i++ {
go func(j int) {
hello(j)
}(i)
}
time.Sleep(time.Second)
}
1.2 CSP (Communicating Sequential Processes)
Go语言提倡通过通信共享内存而不是通过共享内存而实现通信
1.3 Channel
make (chan 元素类型, [缓冲大小])
- 无缓冲通道 make(chan int)
- 有缓冲通道 make(chan int, 2)
02.依赖管理
了解Go原因依赖管理的演进路线
- 工程项目不可能基于标准库0 ~ 1编码搭建
- 管理依赖库
2.1 Go依赖管理演进
GOPATH -> Go Vendor -> Go Module
- 不同环境(项目)依赖的版本不同
- 控制依赖库的版本
依赖分发-回源
-
无法保证构建稳定性
- 增加/修改/删除软件版本
-
无法保证依赖可用性
- 删除软件
-
增加第三方压力
- 代码托管平台负载问题
变量 GOPROXY
GOPROXY="https://proxy1.cn,https://proxy2.cn,direct"
服务器站点URL列表, "direct"表示源站
优先从Proxy1中查找, 没有则到Proxy2中查找, 再没有就会到源站Direct中查找
总结: 依赖管理三要素
- 配置文件, 描述依赖 go.mod
- 中心仓库管理依赖库 Proxy
- 本地工具 go get/mod
03.测试
从单元测试实践出发, 提升大家的质量意识
测试分为三层 回归测试 -> 集成测试 -> 单元测试
从左到右, 覆盖率逐渐变大, 成本却逐渐降低
单元测试-规则
-
所有测试文件以 _test.go 结尾
-
func TestXxx(*testing.T)
-
初始化逻辑放到 TestMain 中
- 测试前: 数据装载, 配置初始化等前置工作
- 测试后: 释放资源等收尾工作
如何衡量代码是否经过了足够的测试? 如何评价项目的测试水准? 如何评估项目是否达到了高水准测试等级?
答: 代码覆盖率