一般的編程語言對工程(項目)的目錄結構是沒有什么規定,但是GO語言在這方面做了相關的規定。
我們前面講搭建Go語言開發環境時提到的環境變量 GOPATH,項目的構建主要是靠它來實現的。這么說吧,如果想要構建一個項目,就需要將這個項目的目錄添加到 GOPATH 中,多個項目之間可以使用`;`分隔。
如果不配置 GOPATH,即使處于同一目錄,代碼之間也無法通過絕對路徑相互調用。
## 目錄結構
一個Go語言項目的目錄一般包含以下三個子目錄:
* src 目錄:放置項目和庫的源文件;
* pkg 目錄:放置編譯后生成的包/庫的歸檔文件;
* bin 目錄:放置編譯后生成的可執行文件。
三個目錄中我們需要重點關注的是 src 目錄,其他兩個目錄了解即可,下面來分別介紹一下這三個目錄。
#### src 目錄
用于以包(package)的形式組織并存放 Go 源文件,這里的包與 src 下的每個子目錄是一一對應。例如,若一個源文件被聲明屬于 log 包,那么它就應當保存在 src/log 目錄中。
并不是說 src 目錄下不能存放 Go 源文件,一般在測試或演示的時候也可以把 Go 源文件直接放在 src 目錄下,但是這么做的話就只能聲明該源文件屬于 main 包了。正常開發中還是建議大家把 Go 源文件放入特定的目錄中。
包是Go語言管理代碼的重要機制,其作用類似于[Java](http://c.biancheng.net/java/)中的 package 和 C/[C++](http://c.biancheng.net/cplus/)的頭文件。Go 源文件中第一段有效代碼必須是`package <包名>?`的形式,如 package hello。
另外需要注意的是,Go語言會把通過`go get?`命令獲取到的庫源文件下載到 src 目錄下對應的文件夾當中。
#### pkg 目錄
用于存放通過`go install?`命令安裝某個包后的歸檔文件。歸檔文件是指那些名稱以“.a”結尾的文件。
該目錄與 GOROOT 目錄(也就是Go語言的安裝目錄)下的 pkg 目錄功能類似,區別在于這里的 pkg 目錄專門用來存放項目代碼的歸檔文件。
編譯和安裝項目代碼的過程一般會以代碼包為單位進行,比如 log 包被編譯安裝后,將生成一個名為 log.a 的歸檔文件,并存放在當前項目的 pkg 目錄下。
#### bin 目錄
與 pkg 目錄類似,在通過`go install?`命令完成安裝后,保存由 Go 命令源文件生成的可執行文件。在類 Unix 操作系統下,這個可執行文件的名稱與命令源文件的文件名相同。而在 Windows 操作系統下,這個可執行文件的名稱則是命令源文件的文件名加 .exe 后綴。
## 源文件
上面我們提到了命令源文件和庫源文件,它們到底是什么呢?
* 命令源文件:如果一個 Go 源文件被聲明屬于 main 包,并且該文件中包含 main 函數,則它就是命令源碼文件。命令源文件屬于程序的入口,可以通過Go語言的`go run?`命令運行或者通過`go build?`命令生成可執行文件。
* 庫源文件:庫源文件則是指存在于某個包中的普通源文件,并且庫源文件中不包含 main 函數。
不管是命令源文件還是庫源文件,在同一個目錄下的所有源文件,其所屬包的名稱必須一致的。