Go 语言的包管理

GOPATH

安装 Go 时配置环境变量除了 GOROOT 还有一个 GOPATH,GOROOT 是 go 的安装路径,那么 GOPATH 是什么呢?

Go 语言提供了一个 Workspace 的机制,GOPATH 指的就是 Go 代码所在的 Workspace 位置。一般来说,这个目录下会有 pkg、src、bin 三个子目录。

  • bin 目录用来放置编译好的可执行文件,为了使得这里的可执行文件可以方便的运行, 在 shell 中设置PATH变量。
  • src 目录用来放置代码源文件,在进行import时,是使用这个位置作为根目录的。自己编写的代码也应该放在这下面。
  • pkg 用来放置安装的包的链接对象(Object)的。这个概念有点类似于链接库,Go 会将编译出的可连接库放在这里, 方便编译时链接。不同的系统和处理器架构的对象会在pkg存放在不同的文件夹中。

另外,很多人推荐设置两个 GOPATH,一个用来存放自己写的代码,另一个放的则是包。

包管理

何谓包,这就要说到 Go 语言中的包管理机制。在 Go 语言里,包是一个很重要的概念,表示函数和数据的集合,用 package 关键字定义。直观地看,包就是计算机里的目录/文件夹,类似于 java 中的包,能够将文件组织起来,方便归类和复用。Go 语言内置了大量常用的包,比如:

  • fmt。实现了格式化的 I/O 函数。
  • io。提供了原始的 I/O 操作界面。
  • sort。提供排序功能。
  • os。包含平台无关的操作系统功能接口。
  • sync。提供基本的同步原语。
  • net/http。实现了 http 相关的大部分功能。

Go 语言提供了 import 关键字来导入包,写的路径就是 GOPATH 目录下面。

1
2
3
4
import (
"fmt"
"github.com/zenazn/goji"
)

除了内置的包,Go 语言可以很方便地使用第三方包,这些大多是在 github.com 和 golang.org 上。

使用 go get 命令可以递归获取到远程仓库的包,并存储在 GOPATH 目录下。

其他

Go 在导入包时可以对包进行重命名,这可以避免不同包名称重复的问题。

1
2
3
4
import (
"fmt"
myfmt "mylib/fmt"
)

有时候只需要导入一个包而不使用它,可以将包重命名为 _。

包可以有任意个 init 函数,用来在 main 函数执行前进行初始化操作。使用 _ 重命名的包就只会执行 init 函数。

包命声明为 main 时,表示这是一个可执行程序。在 Go 语言里,同时满足 main 包和包含 main() 函数,才会被编译成一个可执行文件。

1
2
3
4
5
6
7
package main
import "fmt"
func main() {
fmt.Println("Hello, world!")
}