golang学习笔记 ---工作区与GOPATH

GOROOT: Go语言安装根目录的路径,即Go语言的安装路径

GOPATH:是我们自己定义的工作区间, Go语言的工作目录,是我们自己定义的工作区间,可以是一个目录的路径,也可以是多个目录路径,每个目录代表Go语言的一个工作区(Workspace),工作区放置Go语言的源码文件(src),安装后的”.a”结尾的归档文件(pkg)和可执行文件(bin).

GOBIN:GO程序生成的可执行文件的路径

Go语言源码的组织方式:以代码包为基本组织单位,在文件系统中,这些代码包与目录一一对应,目录可以有子目录,代码包也可以有子包。代码包的名称一般会有源码文件所在的目录同名,如果不同名, 在构建、安装过程中会以代码包名为准。

代码包导入路径:从src子目录到该包的实际存储位置的相对路径

导入路径: 

github.com/labstack/echo,

说明: 该代码包的源码文件存在于 GitHub 网站的 labstack 组的代码仓库 echo 中

执行命令

go install github.com/labstack/echo

生成的归档文件的相对目录就是 github.com/labstack, 文件名为 echo.a

归档文件的相对目录与 pkg 目录之间还有一级目录,叫做平台相关目录。平台相关目录的名称是由 build(也称“构建”)的目标操作系统、下划线和目标计算架构的代号组成的。

比如,构建某个代码包时的目标操作系统是 Linux,目标计算架构是 64 位的,那么对应的平台相关目录就是 linux_amd64

因此,上述代码包的归档文件就会被放置在当前工作区的子目录 pkg/linux_amd64/github.com/labstack 中。

某个工作区的 src 子目录下的源码文件在安装后一般会被放置到当前工作区的 pkg 子目录下对应的目录中,或者被直接放置到该工作区的 bin 子目录中。

构建和安装 Go 程序的过程

构建使用命令go build,安装使用命令go install。构建和安装代码包的时候都会执行编译、打包等操作,并且,这些操作生成的任何文件都会先被保存到某个临时的目录中。

  • 如果构建的是库源码文件,那么操作后产生的结果文件只会存在于临时目录中。这里的构建的主要意义在于检查和验证。
  • 如果构建的是命令源码文件,那么操作的结果文件会被搬运到源码文件所在的目录中

安装操作会先执行构建,然后还会进行链接操作,并且把结果文件搬运到指定目录。

  • 如果安装的是库源码文件,那么结果文件会被搬运到它所在工作区的 pkg 目录下的某个子目录中。
  • 如果安装的是命令源码文件,那么结果文件会被搬运到它所在工作区的 bin 目录中,或者环境变量GOBIN指向的目录中。

go build 命令一些可选项的用途和用法

在运行go build命令的时候,默认不会编译目标代码包所依赖的那些代码包。当然,如果被依赖的代码包的归档文件不存在,或者源码文件有了变化,那它还是会被编译

如果要强制编译它们,可以在执行命令的时候加入标记-a。此时,不但目标代码包总是会被编译,它依赖的代码包也总会被编译,即使依赖的是标准库中的代码包也是如此。

另外,如果不但要编译依赖的代码包,还要安装它们的归档文件,那么可以加入标记-i

怎么确定哪些代码包被编译了呢?有两种方法:

  • 运行go build命令时加入标记-x,这样可以看到go build命令具体都执行了哪些操作。另外也可以加入标记-n,这样可以只查看具体操作而不执行它们。
  • 运行go build命令时加入标记-v,这样可以看到go build命令编译的代码包的名称。它在与-a标记搭配使用时很有用。

go get:

命令go get会自动从一些主流公用代码仓库(比如 GitHub)下载目标代码包,并把它们安装到环境变量GOPATH包含的第 1 工作区的相应目录中。如果存在环境变量GOBIN,那么仅包含命令源码文件的代码包会被安装到GOBIN指向的那个目录。

最常用的几个标记有下面几种。

-u:下载并安装代码包,不论工作区中是否已存在它们。

-d:只下载代码包,不安装代码包。

-fix:在下载代码包后先运行一个用于根据当前 Go 语言版本修正代码的工具,然后再安装代码包。

-t:同时下载测试所需的代码包。

-insecure:允许通过非安全的网络协议下载和安装代码包。HTTP 就是这样的协议。

Go 语言官方提供的go get命令是比较基础的,其中并没有提供依赖管理的功能。目前 GitHub 上有很多提供这类功能的第三方工具,比如glide、gb以及官方出品的dep、vgo等等,它们在内部大都会直接使用go get。

有时候,我们可能会出于某种目的变更存储源码的代码仓库或者代码包的相对路径。这时,为了让代码包的远程导入路径不受此类变更的影响,我们会使用自定义的代码包导入路径。对代码包的远程导入路径进行自定义的方法是:在该代码包中的库源码文件的包声明语句的右边加入导入注释,像这样:

package semaphore // import "golang.org/x/sync/semaphore"

这个代码包原本的完整导入路径是github.com/golang/sync/semaphore。这与实际存储它的网络地址对应的。该代码包的源码实际存在 GitHub 网站的 golang 组的 sync 代码仓库的 semaphore 目录下。而加入导入注释之后,用以下命令即可下载并安装该代码包了:

go get golang.org/x/sync/semaphore

而 Go 语言官网 golang.org 下的路径 /x/sync/semaphore 并不是存放semaphore包的真实地址。我们称之为代码包的自定义导入路径。

注意: 这还需要在 golang.org 这个域名背后的服务端程序上,添加一些支持才能使这条命令成功。

原文地址:https://www.cnblogs.com/saryli/p/13569675.html