創(chuàng)建Go工程化項(xiàng)目布局詳解
正文
如果你嘗試學(xué)習(xí)Go,或者你正在為自己建立一個(gè)Poc或者一個(gè)玩具項(xiàng)目,這個(gè)項(xiàng)目布局是沒(méi)有啥必要的,從一些簡(jiǎn)單的事情開(kāi)始(一個(gè)main文件綽綽有余)。當(dāng)有更多的人參與這個(gè)項(xiàng)目的時(shí)候,你講需要更多的結(jié)構(gòu),包括需要一個(gè)tookit來(lái)方便生成項(xiàng)目的模板,盡可能大家統(tǒng)一的工程目錄布局
本文章圍繞github.com/golang-stan… 進(jìn)行說(shuō)明
/cmd
本項(xiàng)目的主干。 每個(gè)應(yīng)用程序的目錄名應(yīng)該與你想要的可執(zhí)行文件的名稱相匹配(例如:/cmd/myapp)
不要在這個(gè)項(xiàng)目中放置太多的代碼,如果你認(rèn)為代碼導(dǎo)入并在其他項(xiàng)目中使用,那么他應(yīng)該位于/pkg
目錄中,如果代碼不是可重用的,或者你不希望其他人重用他,請(qǐng)將該代碼放到/internal
目錄中。
/internal
不希望對(duì)外進(jìn)行共享的代碼,internal
目錄中也可以放置一些子包結(jié)構(gòu),已做到更加細(xì)化的切分,如:
|--internal | | | |--demo | |--biz | |--data | |--service
/pkg
外部應(yīng)用程序可以使用的代碼庫(kù),(例如:/pkg/publiclib)其他項(xiàng)目會(huì)導(dǎo)入這些代碼庫(kù),所以放入到該目錄下的代碼要三思~注意:/internal
目錄是確保私有包不可導(dǎo)入的私有方法,因?yàn)樗怯蒅o在編譯時(shí)強(qiáng)制執(zhí)行的。/pkg 仍然是一種更好的方式,可以顯示的表示目錄中的代碼對(duì)于其他人來(lái)說(shuō)是安全使用的好方法。
/pkg
目錄內(nèi)可以參考GO標(biāo)準(zhǔn)庫(kù)的組織形式,按照功能分類,/internal/pkg
一般用于項(xiàng)目?jī)?nèi)的,跨多個(gè)應(yīng)用的公共共享代碼,但是其作用域僅在單個(gè)工程內(nèi)。
|--pkg | | | |--cache | | |--memcache | | |--redis | | | |--conf | |--dsn | |--env | |--flagvar | |--paladin
/docs,/example,/pkg,/third_parth,/tools
這些跟上文說(shuō)的/pkg
和/internal
都同屬根目錄下的目錄結(jié)構(gòu)
- /docs 放置一些項(xiàng)目說(shuō)明文檔
- /example 放置一些項(xiàng)目的使用示例
- /thrid_parth 三方的一些依賴文件,如:idl文件
- /tools 放置一些項(xiàng)目的腳手架工具,代碼生成工具等
基礎(chǔ)庫(kù)項(xiàng)目布局
每個(gè)公司都應(yīng)該為不同的微服務(wù)建立一個(gè)統(tǒng)一的kit基礎(chǔ)包工具集。 基礎(chǔ)庫(kù)tookit為一個(gè)獨(dú)立的項(xiàng)目,公司級(jí)建議只有一個(gè),按照功能來(lái)拆分會(huì)帶來(lái)不少的管理工作,因此建議并整合
kit包應(yīng)該具備的特點(diǎn)
- 統(tǒng)一
- 標(biāo)準(zhǔn)庫(kù)方式布局
- 高度抽象
- 支持插件
例如下面的布局
|--cache | |--memcache | |--test | |--redis | |--test |--conf | |--dsn | |--env | |--flagvar | |--paladin | |--apollo | |--internal | |--mockserver |--container | |--group | |--pool | |--queue | |--aqm |--database | |--hbase | |--sql | |--tidb |--echo | |--types |--log | |--internal | |--core | |--filewriter |
應(yīng)用程序項(xiàng)目布局
/api
API協(xié)議定義目錄, xxapi.proto protobuf文件以及生成go的文件,我們通常把a(bǔ)pi文檔定義在proto 文件中描述
/configs
配置文件模板或者默認(rèn)配置
/test
額外的外部測(cè)試應(yīng)用程序和測(cè)試數(shù)據(jù),你可以隨時(shí)根據(jù)需求構(gòu)造測(cè)試目錄,對(duì)于較大的項(xiàng)目,有一個(gè)數(shù)據(jù)子目錄是有意義的,例如你可以使用/test/testdata(如果你需要忽略目錄中的內(nèi)容)請(qǐng)注意,Go還會(huì)以“.”或者“_”開(kāi)頭的目錄或者文件,因此在如何命名測(cè)試數(shù)據(jù)目錄方便,有著很大的靈活性。
不應(yīng)該包含/src目錄
有些Go項(xiàng)目確實(shí)有src目錄,這是因?yàn)殚_(kāi)發(fā)人員通常有Java的開(kāi)發(fā)背景。
/internal
/biz
業(yè)務(wù)邏輯的組裝層,類似DDD中的domain,
/data
業(yè)務(wù)數(shù)據(jù)訪問(wèn),包含cache和db等封裝,實(shí)現(xiàn)了biz的repo接口,我們可能會(huì)把data和dao混合在一起,data偏重業(yè)務(wù)的含義,他所做的是將領(lǐng)域?qū)ο笾匦履贸鰜?lái),我們?nèi)サ袅薉DD的infra層,
/service
實(shí)現(xiàn)了api定義的服務(wù)層,類似DDD的applocation層,處理DTO到biz領(lǐng)域?qū)嶓w的轉(zhuǎn)換,(DTO->DO)同事協(xié)同個(gè)類biz交互,但是不應(yīng)該處理復(fù)雜邏輯
布局示意圖
|--api |--configs |--test |--internal | |--biz | |--data | |--service
數(shù)據(jù)流向
以上就是創(chuàng)建Go工程化項(xiàng)目布局詳解的詳細(xì)內(nèi)容,更多關(guān)于Go工程化項(xiàng)目布局的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Go語(yǔ)言reflect.TypeOf()和reflect.Type通過(guò)反射獲取類型信息
這篇文章主要介紹了Go語(yǔ)言reflect.TypeOf()和reflect.Type通過(guò)反射獲取類型信息,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04GoLang使goroutine停止的五種方法實(shí)例
goroutine是Go并行設(shè)計(jì)的核心,下面這篇文章主要給大家介紹了關(guān)于GoLang使goroutine停止的五種方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07Go語(yǔ)言學(xué)習(xí)之結(jié)構(gòu)體和方法使用詳解
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中結(jié)構(gòu)體和方法的使用,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Go語(yǔ)言有一定的幫助,需要的可以參考一下2022-04-04golang框架gin的日志處理和zap lumberjack日志使用方式
這篇文章主要介紹了golang框架gin的日志處理和zap lumberjack日志使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01golang 并發(fā)安全Map以及分段鎖的實(shí)現(xiàn)方法
這篇文章主要介紹了golang 并發(fā)安全Map以及分段鎖的實(shí)現(xiàn)方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-03-03Go語(yǔ)言操作Excel利器之excelize類庫(kù)詳解
Excelize是Go語(yǔ)言編寫的用于操作Office Excel文檔基礎(chǔ)庫(kù),基于ECMA-376,ISO/IEC 29500國(guó)際標(biāo)準(zhǔn),可以使用它來(lái)讀取、寫入由Excel 2007及以上版本創(chuàng)建的電子表格文檔,下面這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言操作Excel利器之excelize類庫(kù)的相關(guān)資料,需要的朋友可以參考下2022-10-10詳解Go語(yǔ)言實(shí)現(xiàn)線性查找算法和二分查找算法
線性查找又稱順序查找,它是查找算法中最簡(jiǎn)單的一種。二分查找,也稱折半查找,相比于線性查找,它是一種效率較高的算法。本文將用Go語(yǔ)言實(shí)現(xiàn)這兩個(gè)查找算法,需要的可以了解一下2022-12-12Go語(yǔ)言學(xué)習(xí)之context包的用法詳解
日常Go開(kāi)發(fā)中,Context包是用的最多的一個(gè)了,幾乎所有函數(shù)的第一個(gè)參數(shù)都是ctx,那么我們?yōu)槭裁匆獋鬟fContext呢,Context又有哪些用法,底層實(shí)現(xiàn)是如何呢?相信你也一定會(huì)有探索的欲望,那么就跟著本篇文章,一起來(lái)學(xué)習(xí)吧2022-10-10Go語(yǔ)言結(jié)構(gòu)體Go range的學(xué)習(xí)教程
這篇文章主要為大家介紹了Go語(yǔ)言結(jié)構(gòu)體Go range的學(xué)習(xí)教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07