基本规则
Go语言-工作区和GOPATH
- 工作区是放置Go源码文件的目录
- 每一个工作区的结构都类似如下所示
一般情况下,Go源码文件都需要存放到工作区中。但是对于命令源码文件来说,这不是必须的
Go语言-源码文件的分类和含义
- Go源码文件
- 名称以
.go
为后缀,内容为Go语言代码组织的文件。 - 多个 Go 代码文件是需要用代码包组织起来的。
- 名称以
- 分三类
- 命令源码文件 (Go语言程序)
- 声明自己属于
main
代码包、包含无参数声明和结果声明的main
函数。 - 命令源码文件是 Go 程序的入口,但不建议把程序都写在一个文件中。
- 同一个代码包中强烈不建议直接包含多个命令源码文件。
- 声明自己属于
- 库源码文件 (Go语言程序)
- 不具备命令源码文件的那两个特征的源码文件。
- 测试源码文件 (辅助源码文件)
- 不具备命令源码文件的那两个特征的源码文件。名称以
_test.go
为后缀。 - 其中至少有一个函数的名称以
Test
或Benchmark
位前缀。并且,该函数接受一个类型为*testing.T
或*testing.B
的指针类型的参数
- 不具备命令源码文件的那两个特征的源码文件。名称以
- 命令源码文件 (Go语言程序)
Go语言 - 代码包的相关知识(上)
- 代码包的作用
- 编译和归档Go程序的最基本单位。(我们可以把若干个go代码程序放在一个代码包下面,然后对这个代码包进行编译或归档。)
- 代码划分、集结和依赖的有效组织形式,也是权限控制的辅助手段。
- 代码包的规则
- 一个代码包实际上就是一个由导入路径代表的目录
- 导入路径即 <工作区目录> /src 或 <工作区目录> / pkg / <平台相关目录> 之下的某段子路径
- 例如:代码包 hypermind.cn 可以对应于
/home/hypermind/golib/src/hypermind.cn
目录(其中/home/hypermind/golib
是一个工作区目录。)
- 代码包的声明
- 每个源代码文件必须声明其所属的代码包
- 同一个代码包中的所有源码文件声明的代码包应该是相同的
- 代码包声明与代码包导入路径的区别
- 代码包声明语句中的包名称应该是该代码包的导入路径的最右子路径,例如
hypermind.cn/pkgtool
->package pkgtool
- 代码包声明语句中的包名称应该是该代码包的导入路径的最右子路径,例如
- 代码包的导入
- 代码包导入语句中使用的包名称应该与其导入路径一致,例如
- 代码包的导入方法
- 带别名的导入
- 本地化的导入
- 仅仅初始化
Go语言 - 代码包的相关知识(下)
- 代码包初始化
- 代码包初始化函数即:无参数声明和结果声明的 init 函数
- init 函数可以被声明在任何文件中,且可以有多个
- init 函数的执行时机 ---- 单一代码包内
- 对所有全局变量进行求值 -> 执行所有 init 函数(一个文件内有多个init 并不确定init的执行顺序)
- init 函数的执行时机 ---- 不同代码包之间
- 被导入的代码包中的 init 函数 -> 执行导入它的哪个代码包的 init 函数
- 例如 A、B、C、三个代码包,A 导入 B,B 导入 C。执行顺序为 C -> B -> A。
- 注意📢:我们不应该对在同一个代码包中被导入的多个代码包的 init 函数的执行顺序做出假设!!!
- 被导入的代码包中的 init 函数 -> 执行导入它的哪个代码包的 init 函数
- init 函数的执行时机 ---- 所有涉及到的代码包
- init 执行会在main函数之前,类似构造函数,不论我们代码包导入了多少init,所有的init只会被执行一次