資料夾結構
Go項目由以下人員組成套餐。我們稱之為命令具有main
標識符。
一個項目可以有
1
包裹n
套餐1
命令1
命令和1
包裹n
命令和1
包裹1
命令和n
套餐n
命令和n
套餐
根據項目的性質,您需要以某種方式組織文件夾結構。
現實世界中的一些例子
讓我們在下面看一些真實的例子。我把他們從建立Go項目的五個建議戴夫·切尼(Dave Cheney)撰寫。
具有以下項目的示例1
包裹:
具有以下項目的示例n
套餐
具有以下項目的示例1
命令
https://github.com/tools/godep
具有以下項目的示例1
命令和1
包裹
https://github.com/monochromegane/the_platinum_searcher
具有以下項目的示例n
命令和n
套餐
https://github.com/golang/tools
項目內文件結構的約定
從這些示例中,我們可以得出以下約定:
如果您有一個命令,它可以存在於main.go
文件放在項目的根目錄中。
使用多個命令,創建一個cmd/
文件夾,然後在此文件夾下創建一個帶有命令名稱的文件夾。在每個文件夾中,理想情況下.go
具有相同名稱的文件將包含main()
功能,儘管不是強制性的。
程序包放在自己的文件夾中,除非您只有一個程序包。
已安裝軟件包的文件系統位置
可以使用以下命令安裝任何Go項目go get
。go get
將在以下位置安裝軟件包$GOPATH/src
。例如輸入
go get github.com/kr/fs
將下載並安裝位於以下位置的1包存儲庫https://github.com/kr/fs,並將其置於$GOPATH/src/github.com/kr/fs
。我們可以在程序中使用import github.com/kr/fs
。
如果我們鍵入怎麼辦
go get github.com/tools/godep
反而?請記住,這是我們之前列出的單命令存儲庫。
go get
會像下載它一樣下載github.com/kr/fs
,並將其放在$GOPATH/src
,但由於它是命令,因此也會編譯並創建一個$GOPATH/bin/godep
二進制的。
Go命令被編譯為所在文件夾的名稱,在這種情況下,該文件夾是根文件夾,因此它是godep
。在使用多個命令的情況下,最後一個子文件夾姓名。例如理想github.com/flaviocopes/tools/cmd/unzip
將被編譯為unzip
。確實不是以包含main()
功能。
工作空間
Go有一個非常獨特的概念工作區。工作空間是文件夾結構,$GOPATH
指著。創建新的工作區時,請添加$GOPATH/bin
文件夾以及您的路徑。例如,如果您要將工作空間設置為~/go
(默認情況下是這樣):
export GOPATH=~/go
export PATH=~/go/bin:$PATH
現在,您運行的所有Go代碼都將引用此文件夾。儘管如上所述,這使您可以創建單獨的工作區在官方文檔中,
Go程序員通常將所有Go代碼保存在一個工作區中。
請注意,這與其他編程環境不同,在其他編程環境中,每個項目都有一個單獨的工作區,並且這些工作區與版本控制存儲庫緊密相關。
這是一個工作區示例,在官方文檔中列出:
bin/
hello # command executable
outyet # command executable
pkg/
linux_amd64/
github.com/golang/example/
stringutil.a # package object
src/
github.com/golang/example/
.git/ # Git repository metadata
hello/
hello.go # command source
outyet/
main.go # command source
main_test.go # test source
stringutil/
reverse.go # package source
reverse_test.go # test source
golang.org/x/image/
.git/ # Git repository metadata
bmp/
reader.go # package source
writer.go # package source
#... (many more repositories and packages omitted) ...
知道了這一點,讓我們看看。
命令和軟件包的放置位置
使用以下命令運行命令時go run
,您可以在任何喜歡的地方放置項目,但這是一種僅對快速測試有用的方法。
您應該在$GOPATH/src
文件夾,帶有您唯一的名稱空間,例如
$GOPATH/src/github.com/flaviocopes/hello
運行時(從系統中的任何位置)
go install github.com/flaviocopes/hello
Go將編譯並放入hello
二進制輸入$GOPATH/bin
,可以從系統中的任何位置運行。
包裹也是如此除了在跑步時go install
,它將編譯後的包放在$GOPATH/pkg
。
參考
- https://golang.org/doc/code.html#Organization
- https://dave.cheney.net/2014/12/01/five-suggestions-for-setting-up-a-go-project
- https://skife.org/golang/2013/03/24/go_dev_env.html
- https://stackoverflow.com/questions/14867452/what-is-a-sensible-way-to-layout-a-go-project
- https://medium.com/@benbjohnson/structuring-applications-in-go-3b04be4ff091
更多教程:
- 使用NGINX反向代理服務Go服務
- 在Go中復制結構
- Go Web服務器的基礎
- 在Go中對地圖類型進行排序
- 簡而言之去指針
- 轉到標籤說明
- 開始日期和時間格式
- 使用Go進行JSON處理
- 可變參數函數
- 去弦備忘單
- 轉到空界面說明
- 使用VS Code和Delve調試Go
- 命名為Go返回參數
- 在Go中生成隨機數和字符串
- Go項目的文件系統結構
- Go中的二進制搜索算法
- 在Go中使用命令行標誌
- GOPATH解釋
- 使用Go構建一個命令行應用程序:lolcat
- 使用Go構建CLI命令:Cowsay
- 在Go中使用殼管
- Go CLI教程:財富克隆
- 使用Go列出文件夾中的文件
- 使用Go從GitHub獲取存儲庫列表
- 去,將一小段字符串附加到文件中
- 去,將字符串轉換為字節片
- 使用Go可視化您本地的Git貢獻
- Go CPU和內存分析入門
- 解決Go程序中的“不支持索引”錯誤
- 測量Go程序中的執行時間
- 使用Go構建Web爬網程序以檢測重複的標題
- 最佳實踐:指針還是價值接收者?
- 最佳實踐:您應該使用方法還是函數?
- Go數據結構:集
- 前往地圖備忘單
- 在Go中生成泛型類型的實現
- Go數據結構:字典
- Go數據結構:哈希表
- 在“通過通道”中實現事件偵聽器
- Go數據結構:堆棧
- Go數據結構:隊列
- Go數據結構:二進制搜索樹
- Go數據結構:圖形
- Go數據結構:鍊錶
- Go數據結構的完整指南
- 比較Go值
- Go是面向對象的嗎?
- 在Go中使用SQL數據庫
- 在Go中使用環境變量
- 上篇教程:PostgreSQL支持的REST API
- 在Go Web服務器上啟用CORS
- 在Docker容器中部署Go應用程序
- 為什麼Go是作為PHP開發人員學習的功能強大的語言
- 去,刪除io.Reader.ReadString換行符
- 開始,如何觀看更改並重建程序
- 去算一下自約會以來的月份
- 在Go中訪問HTTP POST參數