1.3 channel
结果如下:
1
4
9
...
channel通过通信实现共享内存
1.5 waitgroup
add操作是增加计数器, Done操作是减少计数器, Wait等待计数器降低为0退出
2 背景
工程项目需要依赖库
依赖管理:
go path--》go vender--》go module
不同的环境依赖的版本不同
控制依赖库的版本
2.1.1 gopath
go语言支持的环境变量
bin,编译的二进制文件
pkg,项目编译的中间产物,加速编译
src。项目源码
go get下载最新版本的包到源码
go vender
项目目录下增加vendor文件,所有依赖包的副本形式放在$Project/vender
问题,如果我们需要用v1的方法1和v2的方法2,那么就出现了错误
通过go.mod文件管理依赖包
go get/mod去获取依赖
go.mod文件:
第一个是模块路径:module example/project/app
第二个是原生库 : go 1.16
第三个是单元依赖:
require( example/lib1 v1.0.2 example/lib2 v1.0.0 //indirect example/lib3 v1.0.3 )
2.3.2 依赖配置-version
语义化版本
{MINOR}.${PATH}
v1.3.0,v2.3.0
patch是代码bug的修复
基于commit的伪版本
版本前缀+时间戳+commit的hash码前12位前缀
2.3.3 依赖配置-indirect
2.3.4 依赖配置-incompatible
没有go.mod文件并且主版本2+的依赖
如果X项目依赖了A、B两个项目,且A。B分别依赖了C项目的1.3和1.4版本,最终编译的时候使用的C项目的版本为1.4.-->最低兼容版本
2.3.5 依赖分发-回源
-
无法保证构建的稳定性: 作者可以增加,删除,修改软件版本
-
无法保证依赖可用性:作者可能删除
-
增加第三方压力:代码托管平台负载问题
Proxy
github -> Proxy -> developer
能够具有更加有效地稳定和可靠
2.3.6 依赖分发-变量 GOPROXY
go mod是通过配置proxy的环境变量来配置的
direct表示源站
GROPROXY="url1, url2, direct"
proxy1->proxy2->direct
2.3.7 工具 go get
go get example.org/pkg
如果家 @update 默认最新的版本 @none 删除依赖
go mod
init 初始化,创建go.mod文件
download 下载模块到本地缓存
tidy 增加需要的依赖,删除不需要的依赖
2 依赖管理的三要素
- go mod
- proxy
- go tidy