項目搭建
go項目的搭建是非常簡單的,你隨便找一個空文件夾,創建一個go.mod文件和一個main.go文件,一個最簡易的項目就出來了,你可以圍繞main.go不斷拓展你的業務,但是,這並不適合項目膨脹。
在提到項目文件結構之前,我想先對go.mod做幾點標記。
首先,mod文件應該放在你的項目的根目錄下,不要將他放到項目中的哪個文件夾下,對於整個項目而言,go.mod所在的位置就是項目根路徑,對於同項目不同包的引用都是參照go.mod的位置和包聲明的。
比如,go.mod文件內容如下:
module example.com
go 1.18
那么當你在/RootPath/cmd/myentry/main.go
中對/RootPath/internal/decrypt/decrypt.go
中的函數Decrypt()
進行調用時,你就需要在main.go
中這么引用:"example.com/internal/decrypt
",而使用時則是decrypt.Decrypt()
這種包名+具體函數名的方式來調用。
另外,go.mod和GOPATH
是沖突的,當你在根路徑下創建了go.mod后,如果GOPATH
也指向根目錄,就會出現一些錯誤。
這也是有些人會將go.mod放在.../src/
下的原因。
事實上,GOPATH
的作用現在已經基本只剩下構建項目后保存的路徑這么個作用了(當然,如果你刪除go.mod並且將go的環境變量GO111MODULE
設置為off的話,你依然可以使用GOPATH
作為主要的項目路徑。
對於使用go.mod
又希望編譯結果放在根目錄下/bin
路徑下的使用者來說,可以通過設置go的環境變量GOBIN
來實現這一目的,不過這樣設置對於不同項目來說都會指向同一個路徑。
我的建議是將GOPATH
指向項目根路徑下的/build
路徑。
項目結構
上面我提到了一些子路徑,如此這般的項目整體規划並不是規定,也不是規則,更不是官方的建議。
對於項目如何搭建、文件結構如何設計,其實都是開發者自己的選擇和體驗。
甚至,對於小型項目、玩具項目,你甚至不必去管文件結構。那只是種費力不討好的事情。還有可能消耗掉新手對於這門語言的耐性。
事實上,go項目的開發是非常簡單且不需要過多的准備工作的。
正如上一節所言,你只需要一個go.mod用於聲明項目的總名,一個有main()函數入口的的go文件,你就可以愉快的開始開發了。
執行的時候更是只需要go run main.go
就可以得到運行結果。
你甚至不需要IDE。
但是,如果你對於項目的迭代、膨脹是有預期的,且項目內容比較多以至於如果不進行項目管理、文件結構設計的話,會讓開發體驗降低,那么我比較推薦你學習一下這篇文章中的項目結構規范。
Standard Go Project Layout(簡體中文版)
再強調一遍,這不是規定、也不是規則、更不是建議,作為參考即可。
我在這里也做了個簡單的總結:
/*
--Project path
--bin 可執行文件
--build 編譯構建結果
--cmd 代碼,甚至可以只有一個main
--具體包名
--config 配置文件
--docs 文檔文件
--example 樣例應用程序
--internal 不便在cmd做展示的、需要隱藏的、需要加密的代碼
--pkg 外部應用程序使用的代碼庫
--script 腳本
--test 測試代碼
--tools 編寫的工具,可以從pkg、internal引入代碼
--vender 應用程序依賴項
go.mod
*/
或許你會注意到,這里並沒有/src路徑的座位,這是因為src是java的編程習慣,java通過src分割了框架在做的事情,和開發者寫下的事情。
而Go由於模塊引入的便捷,以及語言本身的特性,其實並不需要這么做。
對於上面這樣的文件結構設計來說,cmd並不會存放太多的代碼,大多數的代碼都放在了internal(需要保證私有性的)、tools、vender、pkg中。
當然,即便是用了src作為具體代碼路徑,也不會產生什么影響。
項目編譯
go build
可以對目標包、目標go文件進行編譯,生成可執行文件
go install
可以對指定的包進行完整編譯,生成可執行文件到GOPATH/bin路徑下,對於沒有下載的依賴項也會進行下載操作。
具體的命令使用就不多贅述了。