在Go语言中,包的引用和搜索路径是由环境变量GOPATH和GO111MODULE共同决定的。
GOPATH环境变量:这个变量定义了默认的工作目录,Go命令行工具将会在这个目录下查找包文件。这个目录通常包含三个子目录:src、bin和pkg。
src目录包含所有的源代码。
bin目录存放编译后的可执行文件。
pkg目录存放编译后的包文件。
GO111MODULE环境变量:这个变量用来开启或关闭模块支持。
如果GO111MODULE=off,那么Go会使用GOPATH来查找依赖,并且依赖会被安装到GOPATH中src同级的bin和pkg目录。
如果GO111MODULE=on或者未设置但项目根目录下有go.mod文件,Go将使用模块系统。在这种情况下,依赖关系将被下载到一个特定的$GOPATH/pkg目录,而不是GOPATH的src目录外,并且编译的可执行文件将不会放入GOPATH/bin,除非你显式地设置了GOBIN环境变量。
设置这些环境变量通常在你的shell配置文件中进行,例如.bashrc、.bash_profile或.zshrc。
例如,在bash shell中设置GOPATH和GO111MODULE:
export GOPATH=$HOME/go
export GO111MODULE=on
export GOPRIVATE=github.com/mycorp/*
export PATH=$PATH:$GOPATH/bin
在这个例子中,我们将GOPATH设置为用户主目录下的go文件夹,开启了模块支持,设置了私有模块的访问权限,并且将Go的可执行文件目录添加到了PATH环境变量中。
在Go项目中引用包,你可以使用相对路径或者是绝对路径。绝对路径通常是指从 G O P A T H / s r c 或者模块的 GOPATH/src或者模块的 GOPATH/src或者模块的GOPATH/pkg目录开始的路径。相对路径是指项目内部的路径。
例如,引用同一个GOPATH中的另一个项目的包:
import "myproject/anotherpackage"
引用模块代理下的包(当GO111MODULE=on时):
import "rsc.io/quote"
引用标准库中的包:
import "fmt"
引用外部模块中的包(通常在go.mod文件所在目录下):
import "github.com/gin-gonic/gin"
注意,在Go 1.16及以后的版本中,GO111MODULE默认是开启的,并且GOPATH的功能已经被减少,主要用于兼容老的代码。在新的项目中,建议使用Go模块进行依赖管理。