Go 1.18:項目搭建、項目結構和項目編譯(windows)


項目搭建

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路徑下,對於沒有下載的依賴項也會進行下載操作。

具體的命令使用就不多贅述了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM