go工程实现第二天

104 阅读2分钟

1.3 channel

image.png

结果如下:

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

语义化版本

MAJOR.{MAJOR}.{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 依赖分发-回源

  1. 无法保证构建的稳定性: 作者可以增加,删除,修改软件版本

  2. 无法保证依赖可用性:作者可能删除

  3. 增加第三方压力:代码托管平台负载问题

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 依赖管理的三要素

  1. go mod
  2. proxy
  3. go tidy