Go源码文件组织结构 · golang · 看云
[TOC]
### **工作区目录结构**
我们在本地开发Go项目时,首先要设置好`GOPATH`环境变量。`GOPATH`目录结构一般如下:
```
$GOPATH
├── bin
├── pkg
└── src
```
`GOPATH`目录下有`bin`、`pkg`、`src`三个子目录。`bin`目录用来存放`go install`生成的二进制文件,`pkg`目录用来存放生成的归档文件(.a文件),`src`目录下存放源码文件。
### **Go项目**
Go语言的项目可以是src下的一个子目录,也可以是src下子目录的子目录。
比如,我们可以在src下新建一个子目录project1,把project1作为一个项目的源码的根目录,在这个目录下开始编写Go源码文件。
我们也可以在src下新建`github.com/pshizhsysu`目录,然后在这个目录下新建两个项目project2和project3。如下:
```
src
├── github.com
│ └── pshizhsysu
│ ├── project2
│ │ └── a.go
│ └── project3
│ └── a.go
└── project1
├── a.go
└── util
└── add.go
```
**注意:** 判断src下哪一级目录是一个Go项目的起始目录,就看这个目录下是否第一次出现Go源码文件。比如在上面的结构中,project1目录下开始出现源码文件,那么该目录就是一个Go项目的起始目录;而`github.com/`和`github.com/pshizhsysu/`目录下都没有Go源码文件,所以它们不是Go项目的起始目录,也就是说,project2和project3分别是两个项目,而不是属于同一个项目。
### **Package包**
根据上面的组织结构,Go语言的源码文件一定是在某个目录下。每一个Go源码文件的第一行都必须是`package xxx`,声明本源码文件属于哪个包。一般来说,源文件所属的包名与其所在的目录名最好保持一致,当然也可以不同,**相同目录下的源文件必须属于同一个包**。
目录下面可以有子目录,包下面可以有子包。比如如下面的helloworld项目中,有一个子目录dir1:
```
helloworld
├── say.go
└── dir1
├── hello.go
└── world.go
```
那么say.go属于包helloworld,hello.go与world.go属于包dir1,所以say.go的第一行必须为`package helloworld`,hello.go与world.go的第一行必须为`package dir1`(后面讲述的命令源码文件会有例外)。
### **命令源码文件和库源码文件**
命令源码文件经过编译之后生成的是可执行文件,库源码文件经过编译之后生成是的库文件(归档文件)。
在一个项目中,最多只能有一个命令源码文件。命令源码文件有两个特点:(1)第一行必须是`package main`(2)必须有一个无返回值的main函数。注意虽然这个命令源码文件所在的目录一般不是main,但它的包名必须是main;也就是说,命令源码文件的包名与目录名一般是不一样的。