【基础知识】Go语言的代码组织方式

环境变量

GoRoot: 包含Go 语言安装根目录的路径,也就是 GO 语言的安装路径。
GoPath: 包含若干工作区目录的路径,是我们自己定义的工作空间。
GoBin: 用于放置GO 程序生成的可执行文件的路径。

工作区

  • src子目录:放置源码文件的目录。
  • pkg子目录:放置归档文件的目录。
  • bin子目录:放置可执行文件的目录(仅在未设置全局环境变量GOBIN时有用)。

代码包

与许多编程语言一样,Go 语言的源码也是以代码包为基本组织单位的。在文件系统中,这些代码包其实是与src子目录下的某个子目录一一对应的。由于目录可以有子目录,所以代码包也可以有子包。

每个代码包都会有导入路径。代码包的导入路径是其他代码在使用该包中的程序实体时,需要引入的路径。在实际使用所需程序实体之前,我们必须先导入其所在的代码包。具体的方式就是 import该代码包的导入路径,在工作区中,一个代码包的导入路径实际上就是从 src 子目录到该包的实际存储目录的相对路径

一个代码包中可以包含任意个以.go 为扩展名的源码文件,这些源码文件都需要被声明属于同一个代码包。也就是说,一个文件目录下的所有go文件都必须属于同一个包,同一个代码包中的所有go源码文件的代码包声明语句应该一致。代码包的名称一般会与其源码文件所在的目录同名(强烈建议二者名称保持一致)。如果不同名,那么在构建、安装源码文件的过程中会以代码包名称为准。在导入代码包时也以代码包名称为准。(例如,package main的go文件所在目录名可以不为main)。

设置GoPath有什么意义?

可以把 GOPATH 简单理解成 Go 语言的工作目录,它的值可以是一个目录的路径,也可以是多个目录路径,每个目录都代表 Go 语言的一个工作区(workspace),用来存放go的源码、安装(install)后的归档文件(archive file,也就是以“.a”为扩展名的文件)和可执行文件(executable file)。

源码文件以及安装后的结果文件都会放到哪里呢?

源码文件通常会被放在某个工作区的 src 子目录下。某个工作区的 src 子目录下的源码文件在安装后如果产生了归档文件(以“.a”为扩展名的文件,其实也就是可被连接的本地静态库),就会放进该工作区的 pkg 子目录;如果产生了可执行文件,就可能会放进该工作区的 bin 子目录

归档文件存放的具体位置和规则:源码文件会以代码包的形式组织起来,一个代码包其实就对应一个目录。安装某个代码包而产生的归档文件是与这个代码包同名的。放置它的相对目录就是该代码包的导入路径的直接父级。比如,一个已存在的代码包的导入路径是

github.com/labstack/echo,

那么执行命令

go install github.com/labstack/echo

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

顺便说一下,上面这个代码包导入路径还有另外一层含义,那就是:该代码包的源码文件存在于 GitHub 网站的 labstack 组的代码仓库 echo 中。

此外,归档文件的相对目录与 pkg 目录之间还有一级目录,叫做平台相关目录。平台相关目录的名称是由 build(也称“构建”)的目标操作系统、下划线和目标计算架构的代号组成的。比如,构建某个代码包时的目标操作系统是 Linux,目标计算架构是 64 位的,那么对应的平台相关目录就是 linux_amd64。

小结

事实上,Go 语言项目在其生命周期内的所有操作(编码、依赖管理、构建、测试、安装等)基本上都是围绕着 GOPATH 和工作区进行的。所以说,Go 语言源码的组织方式就是以环境变量 GOPATH、工作区、src 目录和代码包为主线的。一般情况下,Go 语言的源码文件都需要被存放在环境变量 GOPATH 包含的某个工作区(目录)中的 src 目录下的某个代码包(目录)中(注:go mod 引入后,就不需要指定在GOPATH下面了)。
在这里插入图片描述

拓展:构建和安装Go程序的过程

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

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

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

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

《Go语言核心36讲》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值