GO语言入门--工程实践
1. 语言进阶
并发编程
并发 VS 并行
1.多线程在一个核的cpu上运行
2.多线程在多个核的cpu上运行
Go可以充分发挥多核优势高效运行
Goroutine
协程:用户态,轻量级线程,栈KB级别
线程:内核态,线程跑多个协程,栈MB级别
CSP(Communicating Sequence Processes)
提倡通过通信共享内存而不是通过共享内存而实现通信
Channel
make(chan 元素类型,【缓存大小】)
无缓冲通道 make(chan int)
有缓存通道 make(chan int,2)
并发安全lock;WaitGroup
2. 依赖管理(学会站在巨人的肩膀上)
依赖指各种开发包,在开发项目中利用已经封装好的,经过验证的开发组件或工具来提升自己的研发效率。
工程项目不可能基于标准库0-1编码搭建,管理依赖库
GO依赖管理演进 不同环境(项目)依赖的版本不同,控制依赖库的版本
GOPATH
是GO语言支持的一个环境变量,value是Go项目的工作区
目录有以下结构:src:存放GO项目的源码;pkg:是存放编译的中间产物;bin:存放GO项目编译生成的二进制文件
环境变量$GOPATH
项目代码直接依赖src下的代码
Go get 下载最新版本的包到src目录下
弊端 不同项目依赖于某一package的不同版本,我们将无法实现package的多版本控制
同一个pkg,有两个版本,而src下只能有一个版本存在,那俩项目无法保证都能编译通过,也就是在GOpath管理模式下,如果多个项目依赖同个库,但依赖该库是同一份代码,所以不同项目不能依赖同一个库的不同版本,这不能满足我们的项目依赖需求,为了解决这个这一问题,GO vender出现了
GO Vendor
通过每个项目引入一份依赖的副本,解决了多个项目需要同一个package以来的冲突问题。Vendor是当前项目的一个目录,其中存放了当前项目依赖的副本,在vendor机制下,如果当前项目存在vendor目录,会优先使用该目录下的依赖,如果依赖不存在,会从GOPATH中寻找。但vendor无法很好解决依赖包的版本变动问题和一个项目依赖同一个包的不同版本的问题。
弊端:无法控制依赖的版本,更新项目又可能出现依赖冲突导致编译错误
如果a依赖pkg b和c,而b和c依赖d的不同版本,通过vendor的管理模式我们不能很好的控制对于d的依赖版本,归根结底vendor不能很清晰的标识依赖的版本概念。
GO MODULES
是GO语言官方推出的依赖管理模式,解决了之前依赖管理系统存在的诸如无法依赖同一个库的多个版本等问题。定义版本规则和管理项目依赖关系。
通过go.mod文件管理依赖包版本,通过go get/go mod指令工具管理依赖包
依赖管理三要素:
a配置文件,描述依赖
b中心仓库管理依赖库
c本地文件
3. 测试
4. 项目实战
一步一步学习,一点一滴开始,从理论跨向实践