GO语言学习 青训营 day3

67 阅读2分钟

第三天看了下GO语言的工程实践。

1.语言进阶

并发进程的角度来理解GO的高性能本质。

主要涉及三个方面:
协程,通过高效的调度模型实现高并发操作;
通道channel,通过通信实现共享内存;
sync相关关键字,实现并发安全操作和协程间的同步。

2.依赖管理

两个方面,go依赖管理的演进路线和go moudule实践。

go依赖管理的演进路线:

go path--->go vendor--->go module

GOPATH:Go语言支持的一个环境变量,value是Go项目的工作区。项目代码直接依赖src下的代码,go get下载最新的包到src目录下。
缺点:无法实现package的多版本控制。

GO Vendor:如果当前项目存在Vendor目录,会优先使用该目录下的依赖,如果依赖不存在,会从GOPATH中寻找
缺点:vendor无法很好解决依赖包的版本变动问题和一个项目依赖同一个包的不同版本的问题。

GO Module:通过go.mod文件管理依赖包版本
通过go get/go mod 指令工具管理依赖包。

依赖管理三要素:

配置文件,描述依赖;中心仓库管理依赖库,本地工具。

依赖配置:

go.mod;version;indirect;incompatible;依赖图。

依赖分发:从哪里下载,如何下载。
github等代码托管系统平台,直接从对应仓库下载指定依赖。

问题:
直接下载:
无法保证构建确定性:软件作者可以直接代码平台增加/修改/删除 软件版本,导致下次构建使用另外版本的依赖,或者找不到依赖版本。
无法保证依赖可用性:依赖软件作者可以直接代码平台删除软件,导致依赖不可用;
大幅增加第三方代码托管平台 压力。

解决方法:Proxy
Go Proxy 是一个服务站点,它会缓存源站中的软件内容,缓存的软件版本不会改变,并且在源站软件删除之后依然可用,从而实现了供“immutability”和“available”的依赖分发;使用 Go Proxy 之后,构建时会直接从 Go Proxy 站点拉取依赖。

GOPROXY使用:
GOPROXY是一个 Go Proxy 站点URL列表,可以使用“direct”表示源站。对于示例配置,整体的依赖寻址路径,会优先从proxy1下载依赖,如果proxy1不存在,后下钻proxy2寻找,如果proxy2,中不存在则会回源到源站直接下载依赖,缓存到proxy站点中。