go语言系列一之工作区和GOPATH

从今天开始我们一起来学习GO语言,一起努力,一起成长

Go 语言被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。

对于高性能分布式系统领域而言,Go 语言无疑比大多数其它语言有着更高的开发效率。

它提供了海量并行的支持,这对于游戏服务端的开发而言是再好不过了。

先说一下go语言,GO是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易

Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,

并最终于2009年11月开源

在2012年早些时候发布了Go 1稳定版本。

从Go 1.5 版本的自举(即用 Go 语言编写程序来实现

Go 语言自身),到 Go 1.7 版本的极速 GC(也称垃圾回收器),

再到 2018 年 2 月发布的 Go 1.10 版本对其自带工具的全面升级,

以及可预见的后续版本的关键特性,比如用来做程序依赖管理的命令,这些都无不令我们欢欣。

Go 语言在一步步走向辉煌的同时,显然已经成为软件工程师们最喜爱的编程语言之一。

现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。

GO语言具有简介、快速、安全、并行、有趣、开源、内存管理、数组安全、编译迅速等特色

不管学习什么语言,我们第一个要做的事都是要先根据自己电脑的构架和操作系统,从官网下载对应的二进制包(也就是安装包)安装,并且配置环境变量,并且通过命令行中输入 go version来验证是否安装成功

go语言官网:https://golang.google.cn/

安装后目录说明

Go语言安装之后,(我是选择的安装在D盘下)D:\Go目录下一共有9个目录与9个文件,如下图:

api — 目录,包含所有API列表,方便IDE使用

bin— 目录,存放编译后的可执行文件

blog— 目录,

doc— 目录,帮助文档

lib— 目录,

misc— 目录,

pkg— 目录,存放编译后的包文件。pkg中的文件是Go编译生成的

src— 目录,存放项目源文件

注:一般,bin和pkg目录可以不创建,go命令会自动创建(如 go install),只需要创建src目录即可。

Authors— 文件,作者列表,用记事本打开

CONTRIBUTING.md— 文件,

CONTRIBUTORS— 文件,

favicon.ico— 文件,

LICENSE— 文件,license,用记事本打开

PATENTS— 文件,

README.md— 文件,

robots.txt— 文件,使用robots.txt阻止对网址的访问,

VERSION— 文件,版本信息,用记事本打开

设置GO环境变量

(我的安装完成后是自动配置的环境变量)

变量名GOROOT,变量值C:\Go\

修改系统变量Path,添加C:\Go\bin\

一般情况下,我们应该配置 3 个环境变量,即 GOROOT、GOPATH和GOBIN

其中GOPATH的含义是最多的,也是最重要的,那么设置GOPATH有什么意义呢?

标准参考回答是:环境变量 GOPATH 的值可以是一个目录的路径,也可以包含多个目录路径,每个目录都代表 Go 语言的一个工作区(workspace)。这些工作区用于放置 Go 语言的源码文件(source file),以及安装(install)后的归档文件(archive file,也就是以“.a”为扩展名的文件)和可执行文件(executable file)。

Go 语言项目在其生命周期内的所有操作(编码、依赖管理、构建、测试、安装等)基本上都是围绕着 GOPATH 和工作区进行的。

和其他的语言一样,go语言的源码是以代码包为基本组织单位的,在文件系统中,这些代码包其实是与目录--对应的。目录可以有子目录,所以代码包也可以有子包。

一个代码包中可以包含任意个以.go 为扩展名的源码文件,这些源码文件都需要被声明为属于同一个代码包。代码包的名称一般会与这些源码文件所在的目录同名。如果不同名,那么在构建、安装的过程中会以代码包名称为准。

每个代码包都会有导入路径。代码包的导入路径是其他代码在使用该包中的程序实体时需要引入的路径。在实际使用程序实体之前,我们必须先导入其所在的代码包。具体的方式就是

import "github.com/labstack/echo"

在工作区中,一个代码包的导入路径实际上就是从 src 子目录,到该包的实际存储位置的相对路径。

所以说,Go 语言源码的组织方式就是以环境变量 GOPATH、工作区、src 目录和代码包为主线的。一般情况下,Go 语言的源码文件都需要被存放在环境变量 GOPATH 包含的某个工作区(目录)中的 src 目录下的某个代码包(目录)中。

源码文件在安装后如果产生了归档文件,就会放进该工作区的PKG子目录;

如果产生了科学、执行文件,就可能会放进该工作区的bin子目录

归档文件存放的具体位置和规则

源文件会以代码包的形式组织起来,一个代码包其实就对应一个目录。安装某个代码包其实就对应一个目录。安装某个代码包而产生的归档文件是与这个代码包同名的。

放置它的相对目录就是该代码包的导入路径的直接父级。比如,一个已存在的代码包的导入路径是

github.com/labstack/echo

那么执行命令

go install github.com/labstack/echo

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

另外  这个代码还有另外一层含义

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

归档文件的相对目录与 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

确定哪些代码包被编译的两种方法。

1.go  build  -x   可以看到go  build命令具体都执行了哪些操作

   go  build  -n   可以只查看具体操作而不执行

2.go  build  -v 可以看到go  build 命令编译的代码包的名称

  

关于Go源码安装的一个命令 go get

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

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

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

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

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

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

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

工作区和 GOPATH 的概念和含义是每个 Go 工程师都需要了解的。

虽然它们都比较简单,但是说它们是 Go 程序开发的核心知识并不为过。

然而,很多人会忽略掉了它们。

Go 语言提供的很多工具都是在 GOPATH 和工作区的基础上运行的,

比如上面提到的go build、go install和go get,这三个命令也是我们最常用到的。

工作区是指: 放go的源码目录。
gopath是指:指向工作区的路径。

归档文件在Linux下就是.a文件,也就是archive文件,是程序编译成功后生成的静态库文件。写过C程序的朋友都知道,这是程序编译后生成的静态库文件。这跟Java的jar包还不太一样,jar包相当于动态链接库了。

猜你喜欢

转载自blog.csdn.net/g5703129/article/details/82291354