Go进阶
Goroutine 协程:用户态 轻量级线程 栈KB级别 线程:内核态,线程跑多个协程,栈MB级别
CSP 提倡通过通信共享内存 通过通道与多个协程实现通信
Channel 关键字make(chan 元素类型,[缓冲大小]) 分两种1.无缓冲通道 make(chan int) (又称同步通道) 2.有缓冲通道 make(chan int,2) 2为缓冲个数
并发安全 Lock 多个路径同时操作一块内存会发生数据硬态 lock.Lock() lock.Unlock() 对资源加以保护 通过加锁来保证内存的并发安全
WaitGroup 来实现并发任务的同步 内部其实是一个计数器 开启进程就+1 执行结束就-1 主协程阻塞直到计数器为0 Sync包下的 Add(delta int):计数器+delta Done():计数器-1 Wait():阻塞直到计数器为0表示所有并发任务完成
Go的依赖管理
演进 GOPATH----》Go Vendor ------》Go Module(广泛应用)
1.GOPATH 环境变量 $GOPATH bin:项目编译的二进制文件 pkg项目编译的中间产物,加速编译 src:项目源码 项目代码直接依赖src下的代码 go get下载最新包到src 存在弊端:不同项目依赖不同版本的package 从而无法实现package的多版本控制
2.Go Vendor 增加vendor文件 项目依赖会优先寻找vendor找不到再到GOPATH下寻找 这样通过每个项目引入一份依赖副本 解决了多个项目需要同一个package依赖的冲突问题 弊端当一个项目引用两个不同的paceage 而这两个的各自的一个依赖版本之间不兼容 无法控制依赖的版本 更新项目有可能又出现编译错误
3.Go Module 通过go。mod文件管理依赖包版本 通过go get/go mod 指令工具管理依赖包
依赖管理的三要素 1.配置文件,描述依赖 对应go.mode文件 2.中心仓库管理依赖库Proxy 3.本地工具 go get/mod
依赖配置 go.mod 依赖配置 version 以来配置 incompatible +incompatible做一个标识可能有不兼容的代码逻辑
依赖配置-依赖图 go版本选择算法 C1.3/C1.4 选C1.4 选择最低的兼容版本
依赖分发-回源 讲的依赖去哪里下载/如何去下载 Github/SVN/...------>Developer
依赖分发-Proxy 保证依赖的稳定/可靠性
依赖分发-变量GOPROXY Proxy 1-->Proxy 2--->Direct(回原最终的源站) GOPROXY=“网站1,网站2,direct”
工具- go get
测试
单元测试 输出与期望值的校对
Mock测试 有外部依赖
基准测试-优化