本篇主要讲述Golang文件目录结构及相关的一些概念。
由于Golang的基本概念之间有着千丝万缕的联系,可能单独讲a概念会涉及到b概念,讲b概念会涉及到c概念,讲c概念又会涉及到a概念。故配以图片以便更好理解。同时,为了更全面的理解,建议阅读若干次,以将概念串联起来去理解。
1. 工作区
工作区就是通常提到的workspace。Golang并没有限制一个工作区必须对应一个项目。根据Golang的设计理念,一般来讲,我们可以将多个项目放置于同一个工作区。而每个项目可以在不同的代码仓库中。那么怎样设置工作区的路径呢,答案就是GOPATH环境变量。GOPATH环境变量可以包含多个值,每一个值即为一个工作区。如上所述,博主仅仅设定了一个工作区,路径为C:\GoProject(搭建安装环境时设定)
2. 工作区中的固定目录
在工作区中,通常有bin、src、pkg三个目录。目录结构如下所示:
|——src/
| |——a/
| | |——a1/
| | | |——a1.go
| | |——a2/
| | | |——a2.go
| |——b/
| | |——b1.go
| | |
| | |——b2.go
| | |
| |——cc/
| | |——c.go
|——bin/
|
|——pkg/
|
src目录放置不同版本的开发代码库,通常每个代码库下包含多个package(Golang中,包的概念);bin目录放置go install产生的的二进制可执行文件(通常基于main.go编译产生);pkg目录放置go install产生的静态链接文件(.a文件),具体地讲,静态链接文件通常放置在pkg目录的二级目录(以操作系统平台命名,如图1所示)

进入二级目录后,可以看到与go install时指定package同名的目录,如package为a目录下的a1目录,源码文件为a1.go。则对应的链接文件目录为a\a1.a(如图3所示)

有关Golang的目录布局建议,可参考:
3. Package
Package即通常所说的包。与其他编程中包的概念相同,指的是实现某一个功能的代码集合,为模块化编程提供基础,以便提升代码的复用性。在Golang的工作区中的src目录下,可能会有多个代码仓库。每一个代码仓库下可以有多个package,即若使用git管理代码,.git文件与package在同级目录。每一个package即是代码集合的最小单元(最底层的文件目录,如目录树中的src\a\a1)。
每一个package下可包含多个源码文件(.go)。如src\a\a1\a1.go:
package a1
import "fmt"
func ShowA1(){
fmt.Println("a/a1")
}
在这里需要注意,根据文件中的定义,文件所在的package名为a1,同时文件所在的目录名也为a1。Golang并没有严格规定目录名必须要与package名相同。但是根据通常的开发习惯,将其设定为相同的名称。在代码中调用相关函数时,我们需要使用源码文件顶端定义的package名称。而在go install与import语句导入package时,我们需要使用packge的路径。
注:对于某个package中的function和type,若以大写字母开头,则可被外部package访问;若以小写字母开头,则只能在该package内部访问。
4. Package Main和main()
Package main在Golang有着举足轻重的角色——程序的入口。确切地讲,在一个项目(程序)中,承担入口的package必须要在其中的某个源码文件中声明package main(源码文件可以不命名为main.go,没有限制)。必须保证这个package内有且仅有一个开头声明为package main的源码文件。在此源码文件中(开头为package main),有且仅有一个无参数的main方法(main())——程序从此处开始运行。
除去以上起到程序入口作用的package,其他每个package下最多有一个main方法(也可以没有)。这里的main()方法没有特殊的含义;也许是出于开发者的习惯,被命名为main,仅此而已。