Golang在項目結構上沒有強制性規范,雖然這給了開發者很大的自由度,但也需要自己沉淀一套可行的架構。本文介紹了一種項目布局,可以以此為參考設計適合自己的 Golang 項目組織模式。原文: Golang Project Layout
Go 有很多強制的或是約定俗成的規范,但在項目架構方面,就只能靠自己了!對我來說,這很令人困惑,但我們需要的只是一個有效且可以重復使用的架構。下面將展示我是怎么做的,也許你會采用不同的方法,都沒有關系。Go 項目的架構有很多,但我最喜歡這個架構,并且已經用它構建了很多東西:)
布局
這是正在進行的一個個人項目的根(root)布局:

/.github/workflows

如果有人感興趣,我很樂意分享這些工作流代碼。這三個文件可以確保我的 PR 自動運行測試,并確保合并到 main
分支的版本會被容器化并推送到容器倉庫。目前我都是手動部署修改,所以這些就是所需的全部工作。
/api

很抱歉我隱藏了一些內容,但重點應該很明確,此文件用于 api
接口。這是 http API,所有端點都定義在這個文件夾中,并通過其他文件夾中的代碼來提供響應。我在這里定義了中間件,支持結構化日志、跟蹤和度量。
/cmd/server

這是應用程序啟動的位置,是服務的 main
方法。所有路由、邏輯和服務器啟動代碼都放在 server.go
文件中,而且將中間件與路由結合起來。這篇文章不會涉及這些文件的實際內容,這篇文章更關注項目布局,而不是如何實現的具體細節。
/decks

decks 目錄用于存放打算從 postgres 中存儲和檢索的模型或數據。該目錄包含數據庫模型 deck.go
、倉庫和測試(container_test.go
用于測試)。測試是通過一個名為 testcontainers
的庫在 docker 上運行。
/groups

該目錄與 /decks
目錄非常相似。怎么說呢,我喜歡簡單易復制的開發模式。這個文件夾涵蓋了項目中的群組概念。你會看到兩個倉庫,雖然這看起來像是混淆了文件夾(folder)和群組(group)的概念,但我向你保證,我對這種設置很滿意,而且很有效。這些都是 postgres,而且我是在 docker 容器上進行測試的--測試只需要 3 秒鐘,所以雖然比簡單的單元測試慢一些,但幾乎和典型的"集成測試"一樣快。
/mocks
這個文件夾是由 https://github.com/vektra/mockery[1] 生成的,它從項目中獲取接口并自動生成一些樁,可以在測試中使用這些樁。我知道有些人看了會想吐,但這讓測試變得簡單明了。
/pkg/tools

這個模塊提供了幾個助手工具,可以測試一些副作用更大的東西。在我的測試中,控制生成的時間和 uuid 對測試很有幫助,因此這個包創建了一個接口和實現,可以在任何地方使用,并在測試中模擬。有些人覺得不應該有 utils
或 tools
模塊,但我不在乎。
/seed
其中包含一些用于本地測試的 sql 腳本:)
/users

看起來很熟悉吧?編程其實并不難......好吧,你看到的服務并沒有復雜的代碼,但我向你保證,這種架構遠遠超出了簡單的項目。這是另一個用于存儲和檢索用戶的存儲庫。
結語
你會發現這個項目中缺少服務邏輯,目前我還沒有發現有必要分離業務邏輯,所以沒有專門的文件。我曾在生產服務和個人項目中使用這種架構,它用途廣泛且簡單,基本上任何項目都可以重復使用,而且可以避免大多數常見的陷阱(如循環依賴關系),你試一下就知道了。
你好,我是俞凡,在Motorola做過研發,現在在Mavenir做技術工作,對通信、網絡、后端架構、云原生、DevOps、CICD、區塊鏈、AI等技術始終保持著濃厚的興趣,平時喜歡閱讀、思考,相信持續學習、終身成長,歡迎一起交流學習。為了方便大家以后能第一時間看到文章,請朋友們關注公眾號"DeepNoMind",并設個星標吧,如果能一鍵三連(轉發、點贊、在看),則能給我帶來更多的支持和動力,激勵我持續寫下去,和大家共同成長進步!
mockery: https://github.com/vektra/mockery
本文由 mdnice 多平臺發布