1 - 查看目录
在操作系统中安装Go语言编译环境后,有几个需要注意的重要目录,包括GOROOT,GOPATH和GOBIN等。
可以使用 go env
命令查看Go环境变量,包含这几个目录对应的环境变量。
$ go env
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/huabing/.cache/go-build"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/home/huabing/go"
GOPROXY=""
GORACE=""
GOROOT="/usr/local/go"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build688094926=/tmp/go-build -gno-record-gcc-switches"
2 - GOPATH
GOPATH目录是Go的工作目录,其中包含本地的项目文件,项目中引用的的第三方package,以及生成的二进制文件。
目录结构
Go语言工具要求GOPATH的目录结构包含bin,pkg,src三个子目录。
- bin目录下是项目编译生成的二进制文件。
- pkg目录下是项目需要依赖的一些第三方package,这些第三方package并不包含在GOROOT中pkg目录下的基础package中。例如mysql数据库驱动,web框架等。
- src目录中包含项目的源文件,以及通过go get下载的第三方package的源码。
通过go get下载第三方包
可以用go get命令下载第三方包,go get会将源码下载到src目录下,并编译源码生成.a 二进制文件放到pkg目录下。如果源码中包含main文件,则会生成对应的二进制文件放到bin目录中。
使用go get命令安装mysql驱动和代码规范检查工具golint
go get github.com/go-sql-driver/mysql
go get golang.org/x/lint/golint
上面的命令会下载mysql driver和golint的源码,并编译生成二进制package包,由于golint源码中包含了main方法,还会在bin目录生成对应的可执行文件。
目录示例
├── bin //项目生成的可执行文件和通过go get安装的可执行文件
│ ├── golint
│ └── myproject
├── pkg //通过go get安装的第三方包二进制文件
│ └── linux_amd64
│ ├── github.com
│ │ └── go-sql-driver
│ │ └── mysql.a
│ └── golang.org
│ └── x
│ └── lint.a
└── src //项目代码和通过go get安装的第三方包源码
├── golang.org
│ └── x
│ ├── lint
│ │ ├── CONTRIBUTING.md
│ │ ├── golint
│ │ │ ├── golint.go
│ │ │ ├── importcomment.go
│ │ │ └── import.go
│ ......
├── go-sql-driver
│ │ └── mysql
│ │ ├── appengine.go
│ │ ├── auth.go
│ ......
│
└── myproject //本地项目代码
└── myapp.go
GOPATH中是否可以采用多个目录?
GOPATH可以允许设置为多个目录,多个目录之间用:(Linux)或者;(Windows)隔开。在GOPATH设置为多个目录的情况下,go get下载的第三方包会安装到第一个目录下。可以通过设置两个目录来将本地工作目录和第三方包分开:因为go get只会将通过go get下载的第三方包安装在第一个目录中,因此可以将第二个目录作为本地工作目录,以保持工作目录的整洁。
3 - GOROOT
GOROOT是Go的安装目录。Go安装程序会自动设置$GOROOT环境变量,一般不需要手动进行设置。
Linux下GOROOT的缺省目录为 /usr/local/go/,其目录结构如下所示。可以看到,GOROOT目录中包含了go命令行和go语言自带的一些基础包,如io,net,math等。在安装后,GOROOT目录中的内容不会变化。
├── bin //go命令行二进制
│ ├── go
│ ├── godoc
│ └── gofmt
├── pkg //go标准库的package二进制包,如io,net,math等。
│ ├── include
│ ├── linux_amd64
│ │ ├── archive
│ │ │ ├── tar.a
│ │ │ └── zip.a
│ │ ├── bufio.a
│ │ ├── bytes.a
│ │ ├── compress
│ │ │ ├── bzip2.a
│ │ │ └── ......
│ └── tool
├── src //go标准库源文件,如io,net,math等。
│ ├── archive
│ │ ├── tar
│ │ │ ├── common.go
│ │ │ ├── example_test.go
│ │ │ └── ......
│ ├── bufio
│ ├── builtin
│ ├── bytes
│ ├── ......
│ └── unsafe
└── ......
4 - 其他目录
- GOBIN: go install 和 go get 命令在编译main package后生成的可执行文件的保存目录。如果没有设置GOBIN环境变量,可执行文件会被安装到$GOPATH/bin目录下。
- GOCACHE:在该目录中保存了go编译过程中生成的一些文件,这些文件可以被以后的编译过程重用,以加快编译过程,不用每次都从头开始编译。
- GOTMPDIR:go命令行会在该目录中写入一些临时文件。