精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Go 命令行工具項目結構最佳實踐

開發 前端
本文針對Golang實現的命令行小工具項目結構做了詳細介紹,同時介紹了其他主流Go項目結構。

 最近我在重構早期實現的命令行工具項目,在對項目結構做改動的過程中我沒看到有一個Go 語言項目結構最佳實踐。

其他語言都有這樣一個比較推薦的項目結構,比如Java就有典型項目結構,開發者在這個項目結構下進行開發即可。Python使用Django和Flask時,框架會直接定義好項目結構。但是Go社區還沒有在項目結構這件事上實際達成一致。

雖然已經有一些比較推薦的項目結構出現了,不過普遍推薦的結構對于我的項目并不適用。本文將探討我的項目最終結構并與標準最佳實踐做對比。

用良好的package設計構建項目

第一個最佳實踐是,項目中任何可重用的代碼都要做成一個package。如何設計package結構和有關package的最佳時間就需要單獨寫篇文章,我做過一次關于這個內容的分享,ppt連接在下面:

https://go-pkg-structure.dev/

把代碼放進一個個package要比僅僅重用代碼的好處大得多。從項目結構的角度來說,把代碼放進獨立package有助于把一個個擁有獨立功能的代碼進行分組,這樣更方便其他參與開發的開發者維護代碼,這對開源項目來說意義重大。

獨立成一個個package的做法能讓項目測試起來更容易。把功能獨立成一個個package,就能用更少的依賴對一個個功能進行測試。

在創建和重構項目時,我第一件事就是寫好項目需要的package,甚至會在寫代碼之前創建好基本項目結構。

把應用程序邏輯和接入層邏輯分開

另一個我看到用的比較多的最佳實踐是把應用代碼和接入層代碼分離開,這里接入代碼指的是main包和main()方法。

Go和其他語言一樣,應用的接入層代碼是main方法,當應用開始運行時就是最先執行的一部分邏輯,很可能就把所有初始化邏輯都只寫在main方法里了。把各自初始化邏輯放在app包內實現是比全寫在main方法里更好的做法。

把初始化邏輯放到各自package下是更好的做法,這樣也更方便做測試。比如把Start() Stop() Shutdown()方法都放到app包內,寫測試代碼時就可以在當前包中調用啟動停止這些功能了。

下面是一個app包內的實現例子:

  1. package app 
  2.  
  3. import ( 
  4.  
  5. "fmt" 
  6.  
  7.  
  8. var ErrShutdown = fmt.Errorf("application was shutdown gracefully"
  9.  
  10. func Start(...) error { 
  11.  
  12. // Application runtime code goes here 
  13.  
  14.  
  15. func Shutdown() { 
  16.  
  17. // Shutdown contexts, listeners, and such 
  18.  

如果你的命令行工具項目里,既有服務端代碼也有客戶端代碼,在一個app文件夾內實現的邏輯就能被服務端和客戶端共享。

然而這個做法對簡單的命令行應用不友好,這些應用可能是啟動-執行-停止的模式。但我依然選擇使用把邏輯放到app目錄下的做法,這樣可以把運行時邏輯都放在一起,降低了其他開發者對這個項目的理解難度。

main package里該放些什么?

把我們所有應用都放到app包里之后,也要考慮main包里有什么。很簡單,main包里只有很少內容。

總的來說,我會把main包限制為“只放與用戶交互的代碼”。例如,如果我的項目里既有cli又有服務端邏輯, 我通常會將命令行參數解析的邏輯放入main包中。服務端和客戶端cli編譯的二進制文件會包含不同包,通過解析主程序包中的參數,就可以為不同cli創建獨立的選項。

其他需要和用戶交互的命令行應用,我也傾向于放進main包,例如:

  • 命令行參數的解析
  • 用戶輸入(很簡單的輸入、不參與核心邏輯)
  • 解析配置文件
  • 退出邏輯
  • 處理信號

下面的代碼是一個main方法例子:

  1. // main runs the command-line parsing and validations. This function will also start the application logic execution. 
  2.  
  3. func main() { 
  4.  
  5. // Parse command-line arguments 
  6.  
  7. var opts options 
  8.  
  9. args, err := flags.ParseArgs(&opts, os.Args[1:]) 
  10.  
  11. if err != nil { 
  12.  
  13. os.Exit(1
  14.  
  15.  
  16. // Convert to internal config 
  17.  
  18. cfg := config.New() 
  19.  
  20. cfg.Verbose = opts.Verbose 
  21.  
  22. // more taking command line options and putting them into a config struct. 
  23.  
  24. if opts.Pass { 
  25.  
  26. // ask the user for a password 
  27.  
  28.  
  29. // Run the App 
  30.  
  31. err = app.Run(cfg) 
  32.  
  33. if err != nil { 
  34.  
  35. // do stuff 
  36.  
  37. os.Exit(1
  38.  
  39.  

一種推薦的項目結構

有種被推薦了很多的一種項目結構如下:

  • internal/app - 僅在內部使用的核心應用功能
  • internal/pkg/ - 僅在內部使用的package
  • pkg/ - 需要和外部代碼進行分享的package
  • cmd/<app_name> - 把main package放在帶有app名稱的這個目錄下

這個推薦結構的一個重點在于把核心代碼放在internal/app、入口代碼放進cmd/<app_name>。這種結構對于一次編譯出好幾個二進制文件的項目來說非常友好,比如一次編譯出server和cli的項目。cmd/<app_name>應當包含cli的main方法,cmd/<app_name>-server目錄下放服務端的main方法。這兩者可以在internal/app目錄下共享其他代碼。

總的來說這也是個不錯的目錄結構,但是這個目錄結構對我不適用,看看我是怎么改的吧。

我把package放到了其他路徑下

我做的與上一段的推薦結構不同的是package的路徑。應用程序項目結構的子目錄太多,這與獨立項目結構不同,我也不喜歡用應用程序項目結構組織代碼。我認為,太多子目錄阻礙開發者找到功能實現的代碼。

子目錄多,對代碼量很大的重量級項目來可能比較有必要,但最好不要對小型中型項目使用這種項目結構。

我選擇把所有package都放在代碼根目錄這一層,例如我有個Parser包,它的路徑就是parser/,ssh包的路徑就是ssh/,app包路徑是app/。

這個做法使找包和功能都很容易,因為包和代碼都在項目第一層。再次強調下,把所有包都放在目錄第一層的做法適用于包數量不大的項目,如果項目包數量變多,那還是把包放到pkg/路徑下靠譜。

我沒有采用internal和pkg模式

我并不覺得把代碼放進internal/或者pkg/這種實踐好,主要原因在于這種實踐是針對app內部包。但是關于app內部包并沒有明確的“內”“外”劃分。對于僅在內部使用的包,很多開發者就會因為"沒有其他人使用這些包"所以根本也沒有用最佳實踐。

我也不希望開發者在pkg路徑下像維護一個個獨立項目一樣維護代碼。實際開發中,這些包內的接口可能和一個個獨立項目一樣做變動,那么如果這些邏輯真的是一個個分離開的,還不如放到獨立的項目里實現。

對我來說把我所有項目內部代碼都放到同一個文件夾下更合理。要么是放在頂層目錄下要么是放在pkg/目錄下。

我沒有把所有文件都放進cmd/目錄

cmd/目錄不適用于我的項目。我這個項目里有一個簡單的CLI應用,這個應用要方便使用者下載安裝。最快最方便的安裝辦法是使用go get命令安裝:

  1. $ go get -u github.com/madflojo/efs2 

我想要用戶只需要用go get加項目url就能安裝,但是如果用了cmd目錄就需要讓用戶在url基礎上增加/cmd/<app_name>才能安裝:

  1. $ go get -u github.com/madflojo/efs2/cmd/efs2 

這個url格式比較亂,用戶還需要知道我項目結構是怎么樣的才能安裝。我希望項目結構能讓別人更方便而不是更麻煩。所以我就把這個小應用的main.go文件放到了項目的頂層文件夾下,這樣用戶就可以直接通過go get命令安裝應用了,另把應用的功能實現都放在app包內。

總結

本文的模式應用結果如下:

  1. $ tree -L 2 
  2.  
  3.  
  4. ├── CONTRIBUTING.md 
  5.  
  6. ├── Dockerfile 
  7.  
  8. ├── LICENSE 
  9.  
  10. ├── Makefile 
  11.  
  12. ├── README.md 
  13.  
  14. ├── app 
  15.  
  16. │ ├── app.go 
  17.  
  18. │ └── app_test.go 
  19.  
  20. ├── config 
  21.  
  22. │ ├── config.go 
  23.  
  24. │ └── config_test.go 
  25.  
  26. ├── dev-compose.yml 
  27.  
  28. ├── go.mod 
  29.  
  30. ├── go.sum 
  31.  
  32. ├── main.go 
  33.  
  34. ├── parser 
  35.  
  36. │ ├── parser.go 
  37.  
  38. │ └── parser_test.go 
  39.  
  40. ├── ssh 
  41.  
  42. │ ├── ssh.go 
  43.  
  44. │ └── ssh_test.go 
  45.  
  46. └── vendor 
  47.  
  48. ├── github.com 
  49.  
  50. ├── golang.org 
  51.  
  52. └── modules.txt 
  53.  
  54. 7 directories, 18 files 

總的來說我對這個結構很滿意,新開發者也可以比較快地上手代碼。這個結構基本看目錄就可以知道里面的功能了。

把代碼功能一點點拆分到不同package中也幫助我提升了代碼覆蓋率,目前main包放在頂層目錄的做法還沒發現任何弊端。當然這種項目結構可能并不會對所有人適用,項目開發中還是要因地制宜。

 

責任編輯:張燕妮 來源: Go開發大全
相關推薦

2014-02-12 13:30:16

Linux命令行終端工具

2014-07-31 10:09:12

Linux命令歸檔工具

2023-12-01 07:06:14

Go命令行性能

2023-10-30 01:00:42

Go語言Cobra庫

2020-12-11 06:44:16

命令行工具開發

2020-12-10 16:16:08

工具代碼開發

2023-06-09 07:45:29

Kuberneteskubectl

2020-12-08 08:46:07

GoJava工具

2023-03-31 08:44:55

Go開發命令

2010-11-24 17:12:17

MySQL命令行

2013-12-09 14:29:13

OpenStack命令行工具API

2011-01-18 19:11:26

Postfix命令行

2018-05-04 09:15:35

PythonPlumbum命令行

2013-11-15 09:43:15

JDK工具

2019-08-27 10:32:01

Linux操作系統Windows

2013-05-21 14:58:08

系統監視glances開源

2021-11-28 22:16:01

Go語言工具

2014-08-25 16:23:24

2018-04-03 13:50:27

Linux容器命令行工具

2017-06-15 10:32:56

OracleDBV命令行工具
點贊
收藏

51CTO技術棧公眾號

精品在线播放午夜| 偷偷www综合久久久久久久| 精品magnet| 日韩精品无码一区二区三区| 国产伦精品一区二区三区视频痴汉| 一区二区三区四区日韩| 亚洲精品一区在线观看| 精品视频一区二区在线| h片在线播放| 91麻豆免费看片| 成人在线免费观看视视频| 亚洲国产精一区二区三区性色| 国产精品嫩模av在线| 日韩欧美不卡一区| 欧美日韩大尺度| 美女精品视频| 中文字幕一区二区视频| 看欧美日韩国产| 国产高清在线免费| 青椒成人免费视频| 午夜精品美女自拍福到在线| 开心激情五月网| 九九综合九九| 精品成a人在线观看| 欧美视频国产视频| 日本欧美韩国| 五月开心婷婷久久| 免费在线精品视频| aaa日本高清在线播放免费观看| 成人v精品蜜桃久久一区| 91亚洲一区精品| 亚洲第一区av| 欧美一级播放| 国外成人免费在线播放| 无码人妻精品一区二区三区夜夜嗨| 国产探花在线精品| 日韩av在线免费看| 麻豆精品国产传媒av| 日本一区二区三区播放| 欧美一区午夜视频在线观看| 一本岛在线视频| 国产超碰精品| 色婷婷久久久亚洲一区二区三区| 国产毛片视频网站| 丁香花视频在线观看| 亚洲黄色录像片| 免费看黄色a级片| 黄色网址在线免费观看| 国产精品激情偷乱一区二区∴| 欧美一区二区三区精美影视 | 你懂的视频在线一区二区| 午夜精品一二三区| 高清在线成人网| 国产高清在线一区| 欧美 日韩 国产 成人 在线 91| 国产精品一区二区在线看| 成人精品久久一区二区三区| 92久久精品一区二区| 六月婷婷色综合| 国产在线视频91| 国产精品国产三级国产普通话对白| 美腿丝袜一区二区三区| 成人福利视频网| 国产av一区二区三区| 国产精品系列在线播放| 懂色中文一区二区三区在线视频 | 国产黄色精品| 欧美日韩成人综合在线一区二区| 成人不卡免费视频| 成人免费91| 欧美mv和日韩mv的网站| 色综合久久五月| 国产亚洲一区| www.欧美免费| 色婷婷在线视频观看| 一区在线免费| 欧美专区第一页| 亚洲天堂免费av| 国产精品亚洲综合一区在线观看| 成人在线看片| 国产小视频在线| 1024成人网色www| 国产毛片久久久久久国产毛片| yellow在线观看网址| 欧美色videos| 成人黄色一级大片| av在线亚洲色图| 日韩经典中文字幕在线观看| 日本免费www| 韩国欧美一区| 国产精品高潮呻吟视频| 国产精品伊人久久 | 免费视频91蜜桃| 欧美+日本+国产+在线a∨观看| 久久人人爽人人爽人人片av高清| 中文字幕日韩免费| 国产精品综合在线视频| 欧美不卡三区| 91麻豆国产福利在线观看宅福利| 午夜av一区二区三区| 一级黄色特级片| 麻豆国产欧美一区二区三区r| 伊人伊成久久人综合网站| 国产亚洲自拍av| 免费人成精品欧美精品| 国内视频一区| 黄色网址在线免费播放| 91高清视频免费看| 一区二区三区四区影院| 欧美日韩第一| 欧美一区深夜视频| 精品国产18久久久久久| 日本一区二区三区久久久久久久久不| 成人国产一区二区三区| 国产精品videossex撒尿| 亚洲精品白浆高清久久久久久| 麻豆视频在线免费看| 久久美女性网| 国产精品对白刺激久久久| 在线观看免费版| 色婷婷久久久久swag精品| 久久久久亚洲av无码网站| 成人一区而且| 欧美自拍视频在线观看| 日本xxxxxwwwww| 亚洲乱码一区二区三区在线观看| 九九视频精品在线观看| 亚洲国产精品嫩草影院久久av| 欧美黑人极品猛少妇色xxxxx| 一级片视频网站| 国产欧美一区二区精品秋霞影院 | 精品丝袜在线| 欧美成人综合网站| www欧美com| 激情综合网av| 亚洲欧美99| 日韩一区二区三区免费视频| 亚洲视屏在线播放| 欧美日韩乱国产| av在线播放不卡| 三上悠亚久久精品| 国产色噜噜噜91在线精品| 久久大大胆人体| 国产精品欧美亚洲| 国产精品超碰97尤物18| 粉色视频免费看| 99久久亚洲精品蜜臀| 国产日韩欧美在线播放| 麻豆影视在线观看_| 91 com成人网| 青青草原免费观看| 国产91精品精华液一区二区三区 | 日韩精品免费一线在线观看| 日本午夜小视频| yourporn久久国产精品| 久在线观看视频| 伊甸园亚洲一区| 国产精品电影一区| 秋霞午夜在线观看| 91精品国产乱| 亚洲精品午夜久久久久久久| 99r精品视频| 国产av无码专区亚洲精品| 免费av一区| 91精品久久久久久综合乱菊 | 日本道色综合久久影院| 麻豆app在线观看| 欧美在线观看一二区| 影音先锋男人资源在线观看| 经典一区二区三区| www.成年人视频| 性欧美xxxx免费岛国不卡电影| 情事1991在线| 香蕉视频在线播放| 日韩美女一区二区三区| 日韩男人的天堂| 99免费观看视频| 中文字幕视频精品一区二区三区| 欧美精品videosex极品1| 五月婷婷综合久久| 在线免费观看不卡av| 亚洲熟女毛茸茸| 岛国精品在线观看| 日韩一级在线免费观看| 精品视频99| 91情侣在线视频| 欧美日韩免费看片| 不卡av在线网站| 日韩精品123| 91精品国产一区二区三区 | av影片在线看| 日韩欧美123| 无码一区二区三区| 洋洋av久久久久久久一区| 无码h肉动漫在线观看| 激情欧美一区二区| 国产网站免费在线观看| 希岛爱理av一区二区三区| 韩国成人一区| 亚洲欧美久久精品| 国产不卡视频在线| bestiality新另类大全| 亚洲日韩中文字幕| 丰满少妇被猛烈进入| 欧美亚日韩国产aⅴ精品中极品| 五月天丁香激情| 国产三级一区二区| 一级少妇精品久久久久久久| 久久av中文字幕片| 欧美aⅴ在线观看| 欧美精品二区| 一区二区精品在线观看| 亚洲国产网址| 国产91免费视频| 在线播放成人| 国产成人精品在线观看| 九色porny自拍视频在线观看| 日韩在线观看免费全| 国产精品秘入口| 日韩av最新在线观看| www精品国产| 91精品免费观看| 中文字幕乱码无码人妻系列蜜桃| 午夜久久久久久| 强行糟蹋人妻hd中文| 国产精品不卡视频| 亚洲图片第一页| 久久久高清一区二区三区| 国产精品入口麻豆| 国产福利一区二区三区| 日韩成人av免费| 日韩1区2区3区| 国产一级不卡毛片| 亚洲综合激情| 亚洲色成人一区二区三区小说| 国产精品videossex久久发布| 成年人免费观看的视频| 成人久久综合| 四虎永久国产精品| 精品日韩在线| 亚洲春色在线视频| 波多野结衣在线观看一区二区三区 | 久久久九九九九| 国产精品探花一区二区在线观看| 99精品在线观看视频| 精品人妻一区二区免费视频| 成人国产视频在线观看| 稀缺小u女呦精品呦| 懂色一区二区三区免费观看 | 中文字幕欧美人妻精品一区蜜臀| 色综合久久综合| 国产91精品看黄网站在线观看| 色综合天天做天天爱| 中文字幕亚洲乱码熟女1区2区| 日韩欧美国产成人| 天天干,天天干| 欧美在线免费播放| 亚洲在线精品视频| 91精品国产品国语在线不卡| 国产成人久久精品77777综合 | 奶水喷射视频一区| 日本成人中文字幕在线| 久久精品72免费观看| www.色欧美| 懂色av中文一区二区三区| 人妻av一区二区| 久久亚洲综合色| 国产aaaaaaaaa| 亚洲欧美福利一区二区| 69精品久久久| 在线观看亚洲a| 一级特黄特色的免费大片视频| 欧美一级黄色片| 国产自产一区二区| 亚洲欧洲在线播放| 免费av在线网址| 北条麻妃久久精品| 538视频在线| 国产精品444| 久久国际精品| 久久久久久九九| 日韩精品久久| 成人在线播放网址| 老**午夜毛片一区二区三区| 永久免费的av网站| 成人激情av网| 五月天婷婷丁香网| 一区二区三区不卡在线观看| 五月婷婷激情视频| 欧美一区欧美二区| 头脑特工队2在线播放| 日韩在线播放一区| 国产一二三在线| 国产欧美精品日韩精品| 乱亲女h秽乱长久久久| 在线观看日本一区| 国产情侣一区| 国产精品久久久久久久99| www欧美成人18+| 欧美三级 欧美一级| 色综合激情五月| 亚洲免费国产视频| 日韩在线观看网址| 日本不卡网站| 亚洲一区亚洲二区| 黑丝美女一区二区| 好吊妞无缓冲视频观看| 精品一区二区在线看| 欧美熟妇一区二区| 亚洲欧美激情插| 亚洲视频在线免费播放| 亚洲精品永久免费| 欧美草逼视频| 91久久久久久国产精品| 精品国内自产拍在线观看视频| 丰满少妇大力进入| 国产一区二区在线看| 在线看片中文字幕| 一本久久a久久免费精品不卡| 高h放荡受浪受bl| 美日韩精品免费观看视频| 成人在线视频免费看| 欧美成人免费在线| 亚洲精品乱码| 老熟女高潮一区二区三区| 亚洲人成亚洲人成在线观看图片| 性色av一区二区三区四区| 日韩精品免费综合视频在线播放| 亚洲丝袜精品| 91嫩草在线视频| 欧美黄色录像片| 欧美成人福利在线观看| 国产欧美日韩在线看| 色屁屁影院www国产高清麻豆| 精品处破学生在线二十三| 亚洲资源一区| 91九色在线观看| 亚洲最新色图| 日韩不卡的av| 亚洲激情自拍偷拍| 精品久久国产视频| 欧美精品在线视频观看| 玖玖玖视频精品| 永久免费看av| 国产91精品久久久久久久网曝门| 免费一级a毛片夜夜看| 日韩欧美国产不卡| 国产乱码在线| 精品日本一区二区| 亚洲欧美春色| 精品国产成人亚洲午夜福利| 日本韩国欧美在线| av网站无病毒在线| 成人在线精品视频| 欧美a级片网站| 丰满少妇xbxb毛片日本| 天天综合色天天综合| 欧美91精品久久久久国产性生爱| 青草热久免费精品视频| 国产一区二区区别| 欧美成人乱码一二三四区免费| 成人免费一区二区三区在线观看| 国产精品久久无码一三区| 免费av一区二区| 精品综合久久88少妇激情| 国产h视频在线播放| 久久久国际精品| 在线免费一级片| 欧美日韩福利视频| 欧美调教在线| 中文字幕天天干| 亚洲综合在线免费观看| 亚洲av片在线观看| 国产精品久久久av| 最新精品国产| 一区二区不卡免费视频| 欧美日韩在线播放三区四区| 2024最新电影免费在线观看 | 伊人精品视频在线观看| 亚洲国产精品视频| 二人午夜免费观看在线视频| 成人av在线亚洲| 99在线精品免费视频九九视| 中文字幕第4页| 欧美一区二区三区免费视频| 美女91在线看| 中文字幕剧情在线观看一区| 成人午夜短视频| 国产乱码77777777| 久久99精品久久久久久噜噜| 蜜桃精品噜噜噜成人av| 欧美又黄又嫩大片a级| 午夜天堂影视香蕉久久| 日韩美女网站| 久久狠狠久久综合桃花| 激情综合色综合久久| 日本三级小视频| 久久资源免费视频| 国产精品视频一区二区三区四蜜臂| 天堂av.com|