三个目录中存放的文件说明如下 bin //用来存放编译后的可执行文件 pkg //用于存放编译后生成的归档文件 src //用来存放go源码文件 2.2 GOPATH的缺点 在使用GOPATH的模式下,...我们需要将应用代码存放在固定的GOPATH/src目录下,并且如果执行go get来拉取外部依赖会自动下载并安装到GOPATH目录下 第三方套件只要不是官方库,都需要放置在GOPATH/src的路径下才可以使用...需要满足两种情形: 该目录不在GOPATH/src/下 当前或上一层目录存在go.mod文件 on go命令会使用modules,而不会去GOPATH目录下查找。...off go命令将不会支持module功能,寻找依赖按照以前GOPATH的做法去寻找 目前1.16版本默认将这个参数设置成on,而且可能之后的版本会弃用掉GO111MODULE,因此建议要开发Go项目时就不再使用...,我们通过GoModule目录下的一个go.mod文件来引用GoPath目录pkg包下的mod文件夹下的第三方依赖即可 这样以来,既解决了原来只能局限在GoPath目录src包下进行编程的问题,也解决了第三方依赖包难以管理和重复依赖占用磁盘空间的问题
例子: // 自动分析源码中的依赖,安装依赖包 go mod tidy // 在项目根目录安装依赖包,会自动将依赖信息写入go.mod go get github.com/jinzhu/gorm /...只要在项目目录,执行go get命令安装第三方包,会自动更新go.mod文件,将依赖信息添加进去,因此我们只要将go.mod提交到代码仓库中,其他开发者只要更新代码,运行程序,就会自动下载缺少的依赖包。...5.vendor目录 默认情况下,Go语言安装的第三方依赖包,是安装在GOPATH/src目录下面,不是安装在项目目录中,go编译器也会到GOPATH目录中查找安装包。...go语言也支持将第三方依赖包安装到项目目录中,这个目录就是vendor,如果项目的根目录下面存在vendor目录,编译器优先到vendor目录中查找依赖包。...下面是go module的命令,可以一键创建vendor目录,将依赖包复制进去。
go install 命令安装编译好的包到 $GOPATH/pkg/ 中,例如将 example.com/y/z 安装到 $GOPATH/pkg/example.com/y/z.a。...go get 命令下载源码包到 $GOPATH/src/ 中,例如将 example.com/y/z 下载到 $GOPATH/src/example。...如果设置该变量 GO111MODULE=auto (或者不设置),go 命令行会根据当前工作目录来决定使用哪种模式,如果当前目录在 $GOPATH/src 以外,并且在根目录下存在 go.mod 文件,...这个规则保证了所有在 $GOPATH/src 中使用 auto 值时原有编译不受影响,并且还可以在其他目录中来体验最新的 Go module 开发模式。...指令是不感知 GOPATH 的,将代码下载到其他目录也一样可以。
fix,然后再去做其他的事情 -t 同时也下载需要为运行测试所需要的包 -u 强制使用网络去更新包和它的依赖包 -v 显示执行的命令 基本使用方式如下: go get github.com/davyxu...go get安装功能迁移 随着go install的出现,在golang 1.18版本中,go get将二进制安装相关的功能都转移到了go install,仅作为用于编辑go.mod文件的命令存在。...改造原因 Go一直使用 go get 命令,将需要的工具安装到$GOPATH/bin 目录下,但这种方式存在一个很严重的问题。...Go 1.16 中GO111MODULE 默认是打开的,go install不会修改 go.mod 之类的文件,不会造成任何意外。...小结 如果你使用的是Golang 1.18及以上版本,那么之前很多文章中go get命令可能并不适合依赖二进制了,而需要改用go install命令来进行操作。
go install命令安装编译好的包到$GOPATH/pkg/中,例如将example.com/y/z安装到$GOPATH/pkg/example.com/y/z.a。...go get命令下载源码包到$GOPATH/src/中,例如将example.com/y/z下载到$GOPATH/src/example。...如果设置该变量GO111MODULE=auto(或者不设置),Go命令行会根据当前工作目录来决定使用哪种模式,如果当前目录在$GOPATH/src以外,并且在根目录下存在go.mod文件,那么Go命令会启用...这个规则保证了所有在$GOPATH/src中使用auto值时原有编译不受影响,并且还可以在其他目录中来体验最新的Go Module开发模式。...的,将代码下载到其他目录也一样可以。
如何查看 GOPATH 路径 实习生:在命令控制台输入 go env GOPATH 或者输入: go env | grep GOPATH 进入GOPATH目录,查看该目录下的所有文件。...因此在使用 GOPATH 模式下,我们需要将应用代码存放在固定的GOPATH/src目录下,并且如果执行go get来拉取外部依赖会自动下载并安装到GOPATH目录下。...go.mod 文件,内容如下: module test_mod go 1.17 如果想引入第三方网络包,在该项目目录执行 go get 仓库地址。...go mod tidy 如果我们 go.mod 导入了第三方包,但项目代码中我不用,就是玩。领导发现后,不小心一个 go mod tidy 命令,直接把你回到解放前。...就是去掉go.mod文件中项目不需要的依赖。
追加依赖之类的,但还存在类似 go mod tidy 之类的命令,所以使用频率可能不会很高; Go 1.16 中已解决的工具安装问题 到目前为止,Go 一直使用 go get 命令,将我们需要的工具安装到...$GOPATH/bin 目录下,但这种方式存在一个很严重的问题。...此外由于 Go 1.16 中 GO111MODULE 默认是打开的,go install 不会修改 go.mod 之类的文件,不会造成任何意外。 注意: @version 只能安装主软件包。...并且不能安装未出现在 go.mod 中的包。...go get 将二进制安装相关的功能都转移到了 go install, 仅作为用于编辑 go.mod 文件的命令存在。
同时,将引入的第三方包会下载到GOPATH/pkg目录下。我们先来看下在这种包管理模式下,使用go get是如何安装依赖包的,然后再分析这种包管理的不足。...假设我们有一个第三方包redis,项目A首次引入该包时,使用go get命令从代码库的master分支下载当前最新的代码,并将该包保存在本地的GOPATH/pkg目录下。...另外,升级或重新安装的包也会被安装到GOPATH/pkg下的相同目录,因为没有版本的管理,所以会覆盖之前。 好了,以上就是在传统的包管理方式中的两大主要不足之处。...2.5 module存储在哪里 当go get将包下载下来后,会将其存储到GOPATH/pkg/mod目录下。...因此,需要使用go get安装该大版本的模块,同时在对应的文件中通过import引入该包。例如encodex模块升级到了v2版本,那么就需要在encodex模块的go.mod中将导入路径更改为v2。
环境变量 GOPATH:Go 项目的工作目录,现在有了 Go Module 模式,所以基本上用来放使用 go get 命令获取的项目 GOBIN:Go 编译生成的程序安装目录,比如 go install...命令 会把生成的go 程序安装到 GOBIN 目录下,以供终端使用。...Go Module 模式开进行开发,此模式不必将代码放在GOPATH目录中,可以在任意位置来创建项目。...go mod tidy 增加缺失的包,移除没用的包 ? 将文章开始的 Hello World 实例写入到 main.go 文件中。 ❝main.go 就是整个项目的入口文件,里面有mian函数。...以上生成的可执行文件在项目根目录,也可以把它安装到 GOBIN目录或者其他任意位置:go install /main.go❝go install 命令可以将程序生成在GOBIN目录,现在可以在任意位置打开终端
,并在目录中存放包: 通过 go help gopath 或者go env GOPATH 命令可看到当前go运行时候的环境变量: Here's an example directory layout:...tidy go mod常用命令 go get url //下载指定的依赖包 go mod init // 初始化 go.mod,将开启 mod 使用 go...目录中查找到依赖包,则进入 $GOROOT 目录查找依赖包 GOROOT 目录也没有依赖包,则进入 GOPATH 目录寻找依赖包 go mod编译模式 在开启go mod后,GOPATH/src 目录下的依赖将是无效的...将使用工程的 vendor 目录下的 package 而不是 mod cache( GOPATH/pkg/mod) 目录. 该模式下编译,将不会检查 go.mod 文件下的包版本....但是会检查 vendor 目录下的 modules.txt(由 go mod vendor 生成). 在 go.1.14 及更高版本,若存在 vendor 目录,将优先使用 vendor 模式.
go命令直接支持使用Modules,包括记录和解析对其他模块的依赖性。Modules替换旧的基于GOPATH的方法,来指定使用哪些源文件。...Modules和传统的GOPATH不同,不需要包含例如src,bin这样的子目录,一个源代码目录甚至是空目录都可以作为Modules,只要其中包含有go.mod文件。 如何使用go.mod?...这种情况下可以分为两种情形: 当前目录在GOPATH/src之外且该目录包含go.mod文件 当前文件在包含go.mod文件的目录下面。...1.首先我们要在GOPATH/src 目录之外新建工程,或将老工程copy到GOPATH/src 目录之外。 PS:go.mod文件一旦创建后,它的内容将会被go toolchain全面掌控。...直接 go run hello.go 稍等片刻… go 会自动查找代码中的包,下载依赖包,并且把具体的依赖关系和版本写入到go.mod和go.sum文件中。
取而代之的是 go get,通过使用它们的导入路径来获取所有源并将其存储在 $GOPATH/src 中。没有版本控制并且『master』分支表示该软件包的稳定版本。...Go Modules 不使用 GOPATH 存储每个软件包的单个 git checkout,而是存储带有 go.mod 标记版本的标记版本,并跟踪每个软件包的版本。...但如果使用了 Go modules,当你在一个有着 go.mod 文件存在的仓库下使用这个命令会将你所下载或安装的包静默记录于 go.mod 文件中。 Go Modules 依赖项的存储在哪个目录?...使用 Go Modules 时,在 go build 期间使用的包存储在 $GOPATH/pkg/mod 中。...在尝试在开发工具中的import时,你可能最终使用的包是 GOPATH 中的版本,而不是编译期间使用的 pkg/mod。
Go 语言 有一个特殊命令,用于将应用程序的二进制包编译并安装到应用程序用户可以访问的路径中。 让我用我们都能理解的方式来解释一下。 首先,我们来谈谈 PATH。...好的,现在你已经了解了 GOPATH 是什么,它如何使用? 让我告诉你。 让我们编写一个程序来计算圆周率的近似值。此应用程序的工作原理如下: 导入包 fmt、math 和 math/rand。...为此,你可以使用 go install,它会将该新二进制文件移动到你的 GOPATH 中。...Go 已将其移动到你的 GOPATH 中。请记住使用以下命令列出你的 GOPATH: echo $GOPATH 这应该会打印出你的 GOPATH。...这里的诀窍是 Go 不会仅仅将可执行文件复制到你的 GOPATH 的根目录。相反,它会将其复制到该路径中的 bin 目录。
Golang 编译器会优先在 vendor 下搜索依赖的第三方包 开发者将特定版本的依赖包存放在 vendor 下面并提交到代码库 那么所有人理论上都会得到同样的编译结果,从而实现reporduceable...路径在 $GOPATH/src 或者 vendor 下逐级目录匹配 Go 1.8 版本中,如果开发者没有显式设置 GOPATH,Go 会赋予 GOPATH 一个默认值(在 linux 上为 HOME/...:模块支持,go 会忽略 GOPATH 和 vendor 文件夹,只根据 go.mod 下载依赖 GO111MODULE=auto:在 $GOPATH/src 外面且根目录有 go.mod 文件时,开启模块支持...在使用模块的时候,GOPATH 是无意义的,不过还是会把下载的依赖储存在 GOPATH/pkg/mod 中,也会把 go install 的结果放在 GOPATH/bin 在 ~/test 下创建...mod 直接引用的包,而是由其他 mod 间接引用的包 如果之后新增了该 mod 的直接引用,会删除上面的间接引用 go compiler 将下载的依赖包缓存在 $GOPATH/pkg/mod 下面:
在golang中,所有源文件都属于一个包,golang的包具有以下特性: 包可以被其他包引用 每个golang程序只有一个main包 包的主要用途是提高代码的可复用性 本节,我们将介绍包的相关概念以及使用方法...使用GOPATH时,golang会在以下目录中搜索包: GOROOT/src:该目录保存了Go标准库里代码。 GOPATH/src:该目录保存了应用自身的代码和第三方依赖的代码。 2....一是编译包文件(无main包),将编译后的包文件放到 pkg 目录下(GOPATH/pkg)。二是编译生成可执行文件(有main包),将可执行文件放到 bin 目录(GOPATH/bin)。...GO111MODULE=on:模块支持,根据go.mod文件下载依赖 GO111MODULE=auto:在$GOPATH/src外面且项目根目录有go.mod文件时,自动开启模块支持 在使用模块的时候,...Go Modules可以轻易地进行一个包的依赖管理和版本控制,go build和go install将自动使用go.mod中的依赖关系,减少了GOPATH管理时的复杂性。
一、GoPath GOPATH 是什么? 在Golang中存在两个重要目录,分别是GOROOT、GOPATH。 GOROOT:Go 语言安装目录,属于 Go 语言顶级目录。...如果不同项目想使用同一个包的不同版本,那么就无法实现。例如A项目想使用X包的v1版本,B项目想使用X包的v2版本,在GoPath中是无法实现的。...所谓 vendor 机制,就是在不同的Golang项目的目录中,创建一个目录名为vendor的目录,将Golang项目的所有依赖包缓存到该目录中。...但是随着项目不断迭代,依赖的三方包会越来越多,vendor目录会变得越来越大,将vendor目录提交到代码仓库,还会影响代码的下载速度。...go.mod 类似java中的maven将依赖声明在.pom文件中一样,golang将依赖声明在go.mod中,下面是一个典型的go.mod文件组成: module github.com/xx/test
编译 Go 代码会优先从 vendor目录先寻找依赖包, vendor目录如果没有找到,然后在 GOPATH 中查找,都没找到最后在 GOROOT 中查找。...命令:govendor--help查看所有命令(要先使用go get xxx将xxx依赖下载到$GOPATH/src中,此时go vendor包管理本质是基于GOPATH模式的) 初始化 vendor...GOMODULE模式和 GOPATH模式一样都指定了依赖包存放的位置,而不是如vendor模式放入工程内,区别在于GOMODULE的 go.mod文件中记录了所依赖包的具体版本,既实现了工程之间重用依赖包...文件,事实上,如果你的环境中GO111MODULE=on,使用类似goland的工具创建工程会自动生成go.mod 在 GO111MODULE=on且项目中包含go.mod文件时,执行go get xxx...或 go install xxx下载的包或者二进制可执行文件将放入 GOPATH/pkg/mod目录和 GOPATH/bin目录下。
领取专属 10元无门槛券
手把手带您无忧上云