[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;也就是说,命令源码文件的包名与目录名一般是不一样的。