Go-項目結構和代碼組織


簡介

做大量的輸入,通過對比、借鑒,加上自己的經驗,產出一個盡可能優的方案。

開源界優秀項目的結構示例

因為最新的 Go 版本已經使用 module 作為版本依賴,所以,所有項目的 vendor 我都忽略,建議直接使用 module 來管理依賴,而且較好的解決某些庫國內訪問不了的問題,參考:https://studygolang.com/topics/8737

Docker

https://github.com/moby/moby

├── api      // 存放對外公開的 API 規則
├── builder  // 存放構建腳本等
├── cli      // 命令行的主要邏輯 
├── cmd      // 存放可執行程序,main 包放這個目錄中
├── contrib  // 存放一些有用的腳本或文件,但不是項目的核心部分
├── docs    // 存放文檔
├── internal // 只在本項目使用的包(私有)
├── pkg     // 本項目以及其他項目可以使用的包(公有)
├── plugin  // 提供插件功能

Kubernetes

https://github.com/kubernetes/kubernetes

├── api
├── build  // 存放構建腳本等
├── cmd
├── docs
├── pkg
├── plugin
├── test    // 單元測試之外的測試程序、測試數據
├── third_party // 經過修改的第三方的代碼

Gogs

https://github.com/gogs/gogs

├── cmd
├── conf    // 對配置進行解析
├── docker  // 存放 docker 腳本
├── models  // MVC 中的 model
├── pkg
├── public  // 靜態公共資源,實際項目會將其存入 CDN
├── routes  // 路由
├── scripts // 腳本文件
├── templates // 存放模板文件
``

### influxdb
https://github.com/influxdata/influxdb

├── cmd
├── docker
├── docs
├── http // 存放 HTTP Handler 等,相當於 MVC 的 Controller
├── internal
├── models
├── pkg
├── scripts


### 開源項目小結
總體上,這些優秀開源項目,沒有統一一致的目錄結構方式,但大體上,有一些通用的地方,這就有了** https://github.com/golang-standards/project-layout **這個項目。

## 標准 Go 項目布局(結構)
https://github.com/golang-standards/project-layout 項目總結了 Go 項目的布局,我們一起看看這些主要的目錄。

#### /cmd
該目錄用於存放 Go 項目的入口,即 main.main。一般來說,我們應該在 cmd 目錄下創建子目錄,子目錄名稱代表可執行程序的名稱。上面列出的優秀開源項目基本上遵循了這一規則。
事實上,Go 語言本身,以及 github.com/golang/tools 都采用了 cmd 及其子目錄的形式,所以咱們的項目沒有理由不使用。
一般來說,該目錄中的代碼應該盡可能少。

#### /internal
這是 Go 包的一個特性,放在該包中的代碼,表明只希望項目內部使用,是項目或庫私有的,其他項目或庫不能使用。

#### /pkg
該包可以和 internal 對應,是公開的。一般來說,放在該包的代碼應該和具體業務無關,方便本項目和其他項目重用。當你決定將代碼放入該包時,你應該對其負責,因為別人很可能使用它。
因為 GOPATH 中有一個目錄就是 pkg,所以,社區有些人對該目錄不太能接受。但不管怎么樣,開源界有很多優秀項目在使用它,這里有一些使用它的項目列表:
https://github.com/golang-standards/project-layout/blob/master/pkg/README.md

#### /api
該目錄用來存放 OpenAPI/Swagger 規則說明, JSON 格式定義, 協議定義文件等。也有可能用來存放具體的對外公開 API,比如 Docker:https://github.com/moby/moby/tree/master/api/server 。

#### /init
存放隨着系統自動啟動腳本,如:systemd, upstart, sysv;或者通過 supervisor 進行進程管理的腳本。

#### /scripts
存放 build、install、analysis 等操作腳本。這些腳本使得項目根目錄的 Makefile 很簡潔。

#### /build
該目錄用於存放打包和持續集成相關腳本。

#### /test
一般用來存放除單元測試、基准測試之外的測試,比如集成測試、測試數據等。

Go 語言源碼倉庫中就有 test 目錄。

#### /docs
存放設計和用戶文檔

#### /tools
存放項目的支持工具。

#### /third_party
從第三代碼包抽取過來的。根據官方建議,包名不應該有 _,所以本人不建議使用。真有這樣的需要,考慮命名為 thirdparty。


免責聲明!

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



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