Go-項目結(jié)構(gòu)和代碼組織

簡介

做大量的輸入署照,通過對比臭脓、借鑒酗钞,加上自己的經(jīng)驗,產(chǎn)出一個盡可能優(yōu)的方案。

開源界優(yōu)秀項目的結(jié)構(gòu)示例

因為最新的 Go 版本已經(jīng)使用 module 作為版本依賴砚作,所以窘奏,所有項目的 vendor 我都忽略,建議直接使用 module 來管理依賴葫录,而且較好的解決某些庫國內(nèi)訪問不了的問題着裹,參考:http://www.reibang.com/p/d21fdd13eae8

Docker

https://github.com/docker/engine

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

Kubernetes

https://github.com/kubernetes/kubernetes

├── api
├── build  // 存放構(gòu)建腳本等
├── cmd
├── docs
├── pkg
├── plugin
├── test    // 單元測試之外的測試程序骇扇、測試數(shù)據(jù)
├── third_party // 經(jīng)過修改的第三方的代碼

Gogs

https://github.com/gogs/gogs

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

influxdb

https://github.com/influxdata/influxdb

├── cmd
├── docker
├── docs
├── http // 存放 HTTP Handler 等面粮,相當(dāng)于 MVC 的 Controller
├── internal
├── models
├── pkg
├── scripts

開源項目小結(jié)

總體上少孝,這些優(yōu)秀開源項目,沒有統(tǒng)一一致的目錄結(jié)構(gòu)方式熬苍,但大體上稍走,有一些通用的地方,這就有了** https://github.com/golang-standards/project-layout **這個項目柴底。

標(biāo)準(zhǔn) Go 項目布局(結(jié)構(gòu))

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

/cmd

該目錄用于存放 Go 項目的入口柄驻,即 main.main狐树。一般來說,我們應(yīng)該在 cmd 目錄下創(chuàng)建子目錄鸿脓,子目錄名稱代表可執(zhí)行程序的名稱抑钟。上面列出的優(yōu)秀開源項目基本上遵循了這一規(guī)則。
事實上答憔,Go 語言本身味赃,以及 github.com/golang/tools 都采用了 cmd 及其子目錄的形式,所以咱們的項目沒有理由不使用虐拓。
一般來說心俗,該目錄中的代碼應(yīng)該盡可能少。

/internal

這是 Go 包的一個特性蓉驹,放在該包中的代碼城榛,表明只希望項目內(nèi)部使用,是項目或庫私有的态兴,其他項目或庫不能使用狠持。

/pkg

該包可以和 internal 對應(yīng),是公開的瞻润。一般來說喘垂,放在該包的代碼應(yīng)該和具體業(yè)務(wù)無關(guān)甜刻,方便本項目和其他項目重用。當(dāng)你決定將代碼放入該包時正勒,你應(yīng)該對其負(fù)責(zé)得院,因為別人很可能使用它。
因為 GOPATH 中有一個目錄就是 pkg章贞,所以祥绞,社區(qū)有些人對該目錄不太能接受。但不管怎么樣鸭限,開源界有很多優(yōu)秀項目在使用它蜕径,這里有一些使用它的項目列表:
https://github.com/golang-standards/project-layout/blob/master/pkg/README.md

/api

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

/init

存放隨著系統(tǒng)自動啟動腳本,如:systemd, upstart, sysv赡麦;或者通過 supervisor 進(jìn)行進(jìn)程管理的腳本虹统。

/scripts

存放 build、install隧甚、analysis 等操作腳本。這些腳本使得項目根目錄的 Makefile 很簡潔渡冻。

/build

該目錄用于存放打包和持續(xù)集成相關(guān)腳本戚扳。

/test

一般用來存放除單元測試、基準(zhǔn)測試之外的測試族吻,比如集成測試帽借、測試數(shù)據(jù)等。

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

/docs

存放設(shè)計和用戶文檔

/tools

存放項目的支持工具砍艾。

/third_party

從第三代碼包抽取過來的。根據(jù)官方建議巍举,包名不應(yīng)該有 _脆荷,所以本人不建議使用。真有這樣的需要懊悯,考慮命名為 thirdparty蜓谋。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市炭分,隨后出現(xiàn)的幾起案子桃焕,更是在濱河造成了極大的恐慌,老刑警劉巖捧毛,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件观堂,死亡現(xiàn)場離奇詭異让网,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)师痕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門溃睹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人七兜,你說我怎么就攤上這事丸凭。” “怎么了腕铸?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵惜犀,是天一觀的道長。 經(jīng)常有香客問我狠裹,道長虽界,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任涛菠,我火速辦了婚禮莉御,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘俗冻。我一直安慰自己礁叔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布迄薄。 她就那樣靜靜地躺著琅关,像睡著了一般。 火紅的嫁衣襯著肌膚如雪讥蔽。 梳的紋絲不亂的頭發(fā)上涣易,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機(jī)與錄音冶伞,去河邊找鬼新症。 笑死,一個胖子當(dāng)著我的面吹牛响禽,可吹牛的內(nèi)容都是我干的徒爹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼金抡,長吁一口氣:“原來是場噩夢啊……” “哼瀑焦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起梗肝,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤榛瓮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后巫击,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體禀晓,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡精续,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了粹懒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片重付。...
    茶點(diǎn)故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖凫乖,靈堂內(nèi)的尸體忽然破棺而出确垫,到底是詐尸還是另有隱情,我是刑警寧澤帽芽,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布删掀,位于F島的核電站,受9級特大地震影響导街,放射性物質(zhì)發(fā)生泄漏披泪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一搬瑰、第九天 我趴在偏房一處隱蔽的房頂上張望款票。 院中可真熱鬧,春花似錦泽论、人聲如沸艾少。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽姆钉。三九已至,卻和暖如春抄瓦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背陶冷。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工钙姊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人埂伦。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓煞额,卻偏偏與公主長得像,于是被迫代替她去往敵國和親沾谜。 傳聞我的和親對象是個殘疾皇子膊毁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容