理解工作区
工作区,字面意思,就是程序工作的地方。但是在 Go 的世界里,要想让程序正常工作,你需要按照一种特别的方式来组织你的代码。这种特别的方式就是你需要将你的程序需要放在“工作区”里。“工作区”之外的程序可能并不会如你的预期那样正常执行。
GOPATH
这个“工作区”其实就是一个指定的目录。你在开发程序时需要将其放在这个指定的目录下进行开发。这个目录是由一个名为 GOPATH
的环境变量所控制,默认为 $HOME/go
,(Windows 上默认为 %USERPROFILE%/go
)。
查看当前的“工作区”:
$ go env GOPATH
如果你想要修改“工作区”的位置,那么只需要修改环境变量 GOPATH
的值即可。需要注意的是 GOPATH
的值不能是 Go 的安装目录。
当你使用 go get
来获取第三方的 package 时,程序也会自动将 package 下载到 GOPATH
目录中。
GOPATH
允许指定为多个目录,当指定为多个目录时,使用冒号作为分隔符(Windows 为分号)。并且默认会将 go get
的内容放在第一个目录下。
目录结构
“工作区”的目录结构如下:
src
- 存放 Go 程序的源代码。pkg
- 编译后的 package 对象文件。bin
- 可执行命令
src
目录通常包含多个版本控制仓库用来跟踪一个或多个源码包的开发。这个目录是你开发程序的主目录,所有的源码都是放在这个目录下面进行开发。通常的做法是一个目录为一个独立的项目。例如 $GOPATH/src/hello
就表示 hello
这个应用/包。
因此,每当开发一个新项目时,都需要在 $GOPATH/src/
下新建一个文件夹用作开发。当你在引用其他包的时候,Go 程序也会以 $GOPATH/src/
目录作为根目录进行查找。当然了, src
目录允许存在多级目录,例如在 src
下面新建了目录 $GOPATH/src/github.com/golang/example/hello
,那么这个包路径就是 github.com/golang/example/hello
,包名称为最后一个目录 hello
。
例如
bin/
hello # command executable
outyet # command executable
pkg/
linux_amd64/
github.com/golang/example/
stringutil.a # package object
src/
github.com/golang/example/
.git/ # Git repository metadata
hello/
hello.go # command source
outyet/
main.go # command source
main_test.go # test source
stringutil/
reverse.go # package source
reverse_test.go # test source
golang.org/x/image/
.git/ # Git repository metadata
bmp/
reader.go # package source
writer.go # package source
... (many more repositories and packages omitted) ...
包路径
对于你自己的包,建议设置一个基本路径作为命名空间,来保证它不会与将来添加到标准库或其它扩展库中的包相冲突。
如果你将你的代码放到了某处的源码库中,那就应当使用该源码库的根目录作为你的基本路径。例如,若你在 GitHub 上有账户 github.com/user 那么它就应该是你的基本路径,即新创建项目的路径为 $GOPATH/src/github.com/user/PACKAGE_NAME
。
注意,在你构建这些代码之前,无需将其公布到远程代码库上。只是如若你某天要发布它,就会发现这会是个好习惯。在实践中,你可以选择任何路径名,只要它对于标准库和更大的 Go 生态系统来说是唯一的就行。
我们将在后续的案例中使用 github.com/user
作为基本路径。在你的工作空间里创建一个目录,方便我们将源码存放到其中:
$ mkdir -p $GOPATH/src/github.com/user