GOPATH 是 Go语言中使用的一个环境变量,它使用绝对路径提供项目的工作目录。可以理解为个人的工作区。
这个目录用来存放Go源码,Go的可运行文件,以及相应的编译之后的包文件,这个变量不能和Go的安装目录一样。所以这个目录下面有三个子目录:src、bin、pkg
按照约定这三个目录的作用是:
- src 存放你项目的源码 (xxx.go)
- pkg 存放编译后生成的库文件 (xxx.a)
- bin 存放编译后生成的可执行文件 (如果你将 $GOPATH/bin 加入到 PATH 变量中后, 则可以直接使用编译好的程序)
情形1: 引用自己创建的包
我们设置的 GOPATH=xxx/hello_proj
在GOPATH 路径下创建src 目录 并编写代码如下
我们的在hello.go 的main函数中调用自定义包的PrintHello函数 打印信息
package main
import "my_pkg" //引入自定义的my_pkg包
func main() {
my_pkg.PrintHello() //调用自定义包中的函数
}
自定义包的文件 my_pkg/my_pkg.go 的内容
package my_pkg
import "fmt"
func PrintHello() {
fmt.Println("my_pkg.PrintHello() called.")
}
代码存放的目录结构如下:
hello_proj
└── src
├── hello.go
└── my_pkg
└── my_pkg.go
在GOPATH路径下执行编译命令
cd xxx/hello_proj
go run ./src/hello.go
# 正确输出
# my_pkg.PrintHello() called.
如果不设置GOPATH 那么就会报找不到自定义包的bug
src/hello.go:2:8: cannot find package "my_pkg" in any of:
/usr/local/go/src/my_pkg (from $GOROOT)
/Users/xx/go/src/my_pkg (from $GOPATH)
这就是GOPATH的作用。所有自定义的包的源码都要放在${GOPATH}/src 下面
实操情形2: 引用第三方包的情况
引用第三方包 以常用日志库 github.com/sirupsen/logrus 为例,需要在设置GOPATH的情况下 在GOPATH路径下执行 go get github.com/sirupsen/logrus
会看到 自动在 GOPATH/src 下面下载了 logrus的代码
hello_proj
└── src
├── github.com
│ └── sirupsen
│ └── logrus # 第三方包的代码
├── golang.org # 第三方包引用的其他代码也自动下载
│ └── x
│ └── sys
├── hello
├── hello.go
└── my_pkg
└── my_pkg.go
后面像使用自己的包一样使用第三方包即可。