require (
    github.com/json-iterator/go v1.1.12
)
     疑问
    
假设go.mod中引入了以上这个依赖,那么go会如何去拉取依赖呢?
     Go的下载途径
    
在回答这个问题之前,首先需要明确一点,go下载的依赖途径有两个:
- 
从vcs下载,例如从git 、svn这些版本控制系统中直接clone并将module下载到$GOPATH/pk/mod下。 
- 
从proxy下载,从一个代理服务器中下载已经缓存的module包,代理proxy中存储了$GOPATH/pk/mod中的一样的内容,供开发者下载。proxy中没有开发者需要的module,那么proxy会从vcs更新该module信息。 
     VCS模式
    
     有两种方式可以使
     
      github.com
     
     开头的module从vcs中下载:
    
//1、关闭代理
GONOPROXY=github.com
//2、设为私有库,即将GONOPROXY和GONOSUMDB统一设置为github.com
GOPRIVATE=github.com
     以
     
      github.com/json-iterator/go
     
     这个module依赖为例,描述一下vcs模式下载包的过程:
    
     1、首先go会发现
     
      github.com
     
     开头关闭了代理,走vcs模式。因此直接在module 路径后加一个?go-get=1,发出一个Get请求,如下:
    
此时github返回的html文档中(其他gitlab/gitee/svn也一样),会包含以下标准格式信息:
<meta name=”go-import” content=”
github.com/json-iterator/go
git
” target=”_blank”>https://github.com/json-iterator/go.git”>
go会根据一下模版去解析内容:
<meta name="go-import" content="root-path vcs repo-url">
     得知,repo-url为
     
      https://github.com/json-iterator/go.git
     
     仓库,确定仓库位置后,然后再从中选择tag v1.1.12进行clone,保存在本地的pkg/mod下。
    
     Proxy模式
    
     同样以
     
      github.com/json-iterator/go
     
     v1.1.12这个module依赖为例:
    
     需保证GOPRIVATE和GONOPROXY中没有设置
     
      github.com
     
     ,那么go就会去proxy中寻找该module。
    
proxy的地址,由下面环境变量指定:
GOPROXY=
https://proxy.golang.org
,direct
     1、go先去
     
      https://proxy.golang.org
     
     这个代理中寻找,寻找的Get请求是:
    
https://proxy.golang.org/github.com/json-iterator/go/@v/v1.1.12
     proxy接收到该请求,根据url中的路径去寻找目录
     
      github.com/json-iterator/go
     
     下的module依赖,有就返回。没有的话proxy就会开启vcs模式,按vcs模式的步骤去下载
     
      github.com/json-iterator/go
     
     这个module,下载完后,返回给开发者。
    
     2、假如proxy(
     
      https://proxy.golang.org
     
     )返回4xx,那么就会走下一个代理。本例子中下一个代理是direct指令。direct指令就是表示直接走vcs模式。
    
 
