赞
踩
目录
Go 编译器支持交叉编译,也就是说你可以在一台机器上构建运行在具有不同操作系统和处理器架构上运行的应用程序,也就是说编写源代码的机器可以和目标机器有完全不同的特性(操作系统与处理器架构)。
为了区分本地机器和目标机器,你可以使用 $GOHOSTOS 和 $GOHOSTARCH 设置本地机器的操作系统名称和编译体系结构,这两个变量只有在进行交叉编译的时候才会用到,如果你不进行显示设置,他们的值会和本地机器($GOOS 和 $GOARCH)一样。
它可以包含多个包含 Go 语言源码文件、包文件和可执行文件的路径,而这些路径下又必须分别包含三个规定的目录:src、pkg 和 bin,这三个目录分别用于存放源码文件、包文件和可执行文件。
GOPATH 是 Go 语言中使用的一个环境变量,它使用绝对路径提供项目的工作目录。
- $ go env
- GOARCH="amd64"
- GOBIN=""
- GOEXE=""
- GOHOSTARCH="amd64"
- GOHOSTOS="linux"
- GOOS="linux"
-
- //GOPATH 表示当前工作目录。
- GOPATH="/home/davy/go"
- GORACE=""
-
- //GOROOT 表示 Go语言开发包的安装目录。
- GOROOT="/usr/local/go"
- GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
- GCCGO="gccgo"
- CC="gcc"
- GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0"
- CXX="g++"
- CGO_ENABLED="1"
- CGO_CFLAGS="-g -O2"
- CGO_CPPFLAGS=""
- CGO_CXXFLAGS="-g -O2"
- CGO_FFLAGS="-g -O2"
- CGO_LDFLAGS="-g -O2"
- PKG_CONFIG="pkg-config"
Go 开发包在安装完成后,将 GOPATH 赋予了一个默认的目录
平 台 | GOPATH 默认值 | 举 例 |
Windows 平台 | %USERPROFILE%/go | C:\Users\用户名\go |
Unix 平台 | $HOME/go | /home/用户名/go |
在 GOPATH 指定的工作目录下,代码总是会保存在 $GOPATH/src 目录下。
在工程经过 go build、go install 或 go get 等指令后,会将产生的二进制可执行文件放在 $GOPATH/bin 目录下,生成的中间缓存文件会被保存在 $GOPATH/pkg 下。
如果需要将整个源码添加到版本管理工具(Version Control System,VCS)中时,只需要添加 $GOPATH/src 目录的源码即可。bin 和 pkg 目录的内容都可以由 src 目录生成。
1) 设置当前目录为GOPATH
选择一个目录,在目录中的命令行中执行下面的指令:
export GOPATH=`pwd`
2) 建立GOPATH中的源码目录
使用下面的指令创建 GOPATH 中的 src 目录,在 src 目录下还有一个 hello 目录,该目录用于保存源码。
mkdir -p src/hello
3) 添加main.go源码文件
使用 Linux 编辑器将下面的源码保存为 main.go 并保存到 $GOPATH/src/hello 目录下。
- package main
- import "fmt"
- func main(){
- fmt.Println("hello")
- }
4) 编译源码并运行
此时我们已经设定了 GOPATH,因此在 Go 语言中可以通过 GOPATH 找到工程的位置。
在命令行中执行如下指令编译源码:
go install hello
编译完成的可执行文件会保存在 $GOPATH/bin 目录下。
在 bin 目录中执行 ./hello,命令行输出如下:
hello world
在很多与 Go 语言相关的书籍、文章中描述的 GOPATH 都是通过修改系统全局的环境变量来实现的。然而,根据笔者多年的 Go 语言使用和实践经验及周边朋友、同事的反馈,这种设置全局GOPATH 的方法可能会导致当前项目错误引用了其他目录的 Go 源码文件从而造成编译输出错误的版本或编译报出一些无法理解的错误提示。
比如说,将某项目代码保存在 /home/davy/projectA 目录下,将该目录设置为 GOPATH。随着开发进行,需要再次获取一份工程项目的源码,此时源码保存在 /home/davy/projectB 目录下,如果此时需要编译 projectB 目录的项目,但开发者忘记设置 GOPATH 而直接使用命令行编译,则当前的 GOPATH 指向的是 /home/davy/projectA 目录,而不是开发者编译时期望的 projectB 目录。编译完成后,开发者就会将错误的工程版本发布到外网。
因此,建议大家无论是使用命令行或者使用集成开发环境编译 Go 源码时,GOPATH 跟随项目设定。
在 Jetbrains 公司的 GoLand 集成开发环境(IDE)中的 GOPATH 设置分为全局 GOPATH 和项目 GOPATH,如下图所示。
图中的 Global GOPATH 代表全局 GOPATH,一般来源于系统环境变量中的 GOPATH;Project GOPATH 代表项目所使用的 GOPATH,该设置会被保存在工作目录的 .idea 目录下,不会被设置到环境变量的 GOPATH 中,但会在编译时使用到这个目录。
建议在开发时只填写项目 GOPATH,每一个项目尽量只设置一个 GOPATH,不使用多个 GOPATH 和全局的 GOPATH。
在进行Go语言开发的时候,我们的代码总是会保存在$GOPATH/src目录下。
在工程经过go build、go install或go get等指令后,会将下载的第三方包源代码文件放在$GOPATH/src目录下
产生的二进制可执行文件放在 $GOPATH/bin目录下
生成的中间缓存文件会被保在 $GOPATH/pkg 下。
我们知道源代码都是存放在GOPATH的src目录下,那我们可以按照下图来组织我们的代码。
Go语言中也是通过包来组织代码文件,我们可以引用别人的包也可以发布自己的包,但是为了防止不同包的项目名冲突,我们通常使用顶级域名来作为包名的前缀,这样就不担心项目名冲突的问题了。
因为不是每个个人开发者都拥有自己的顶级域名,所以目前流行的方式是使用个人的github用户名来区分不同的包。
举个例子:张三和李四都有一个名叫studygo的项目,那么这两个包的路径就会是:
import "github.com/zhangsan/studygo"
和
import "github.com/lisi/studygo"
以后我们从github上下载别人包的时候,如:
go get github.com/jmoiron/sqlx
那么,这个包会下载到我们本地GOPATH目录下的
src/github.com/jmoiron/sqlx
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。