GOPATH 样例实践

204 阅读1分钟

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

后面像使用自己的包一样使用第三方包即可。