语言进阶
Go可以充分发挥多核优势,高效运行
1.1 协程
协程:用户态,轻量级线程,栈KB级别(Go语言本身去调动)
线程::内核态,线程跑多个协程,栈MB级别
Go语言可以一次创建上万协程
快速(开多个协程打印)打印hello goroutine:0~hello goroutine :4 调用函数时加一个go关键字
func hello(i int){
println("hello goroutine :" +fmt.Sprint(i))
}
func HelloGoRoutine(){
for i :=0;i <5;i++{
go func(j int){
hello(j)
}(i)
}
time.Sleep(time.Second)
}
1.2 CSP
Go语言通过通信来共享内存
1.3 Channel
make(chan 元素类型,[缓冲大小])
make(chan 元素类型,[缓冲大小])
1.4 并发安全Lock
不加锁会输出未知的结果
1.5 WaitGroup
实现并发同步
Add(delta int),Done(),Wait()
小结 1.协程:通过高效的调度模型实现高并发操作 2.管道:通过通信实现共享内存 3.Sync相关关键字:实现并发安全操作和协程间的同步
依赖管理
依赖:各种开发包
2.0 背景
单体函数只需要依赖原生SDK
实际开发通过SDK引入
2.1 Go依赖管理演进
Gopath--> Go Vendor --> GoModule
实现不同环境的版本
控制依赖库的版本
2.1.1 Gopath
bin:项目编译的二进制文件
pkg:项目编译的中间产物,加速编译
src:项目源码
项目代码直接依赖src下的代码
go get下载最新版本的包到src目录下
弊端:
场景:A和B依赖于某一package的不同版本
问题:无法实现package的多版本控制
2.1.2 Go Vendor
项目目录下增加vendor文件,所有依赖包副本放在#ProjectRoot/vendor
通过每个项目引入一份依赖的副本,解决了多个项目需要同一个package依赖的冲突问题
弊端:无法控制依赖版本。更新项目又可能出现依赖冲突,导致编译出错
2.1.3 GoModule
go.mod文件管理依赖包版本
go get/go mod指令工具管理依赖包
定义版本规则和管理项目依赖关系
2.2 依赖管理三要素
1.配置文件,依赖描述 go.mod
2.中心仓库管理依赖库 Proxy
3.本地工具 go get/mod
2.3.1依赖配置
2.3.2依赖配置 -version
语义化版本
基于commit的伪版本
2.3.3依赖配置 -indirect
2.3.4依赖配置 -incompatible
选择最低的兼容版本
依赖管理三要素: 1.配置文件,描述依赖 go.mod 2.中心仓库管理依赖库 Proxy 3.本地仓库 go get/mod