2.3.5 网络代理GOPROXY
有可能我们在安装Go语言环境和编写“hello world”程序时都非常顺畅,但在下载第三方包时,网络成了我们最大的绊脚石!特别是以golang.org/x/开头的包,国内是无法直接访问该包的。
例如使用go get命令下载包golang.org/x/sys/windows时,可能会出现网络超时错误,示例如下。
package golang.org/x/sys/windows: unrecognized import path "golang.org/x/sys/windows"
(https fetch:
Get https://golang.org/x/sys/windows?go-get=1: dial tcp 216.239.37.1:443: i/o timeout)
为了解决网络问题,不同版本的Go语言采取了不同的处理方式。
1.解决网络问题的方法
在Go1.11之前的版本中,解决网络问题首先要下载第三方软件包,然后根据软件包官方提供的下载路径创建与其对应的$GOPATH/src路径,最后运行go install命令安装此软件包。
在Go1.11版本之后,有了更简便的解决方法!使用与Go Module一起发布的Module proxy protocol来设置模块代理,然后将其交由环境变量GOPROXY处理,再然后通过代理的方式指引go命令抓取模块的路径,从而解决网络和路径的问题。从Go1.11版本开始,困扰用户很久的网络问题已不再是问题。通过设置环境变量GOPROXY,可以直接使用go get命令下载软件包。在Go1.13版本中,可以为GOPROXY设置多个代理列表,各代理服务器之间采用逗号分隔。此外,Go1.15版本还实现了社区的需求,添加了管道符“|”作为分隔符。
2.使用GOPROXY的注意事项
使用“go env -w GOPROXY=https://goproxy.cn,direct”命令配置环境变量GOPROXY时,请注意以下两点。
(1)在Go1.11和Go1.12版本中,需要将GO111MODULE配置成on才能使GOPROXY的配置生效。
(2)direct是Go1.13版本中新增的语法,目的是在一定程度上解决私有库的问题。其工作原理是若Go在抓取目标模块时遇到错误“404”,则回退到direct处,直接去目标模块的源头(比如GitHub)抓取。
3.环境变量的使用方法
在使用GOPROXY时,需要注意表2-2中提到的几个环境变量的使用方法。
表2-2 与GOPROXY有关的环境变量及其使用说明