Go项目目录结构中如何组织和分解服务?

假设我有一个通过 API 与 Github 通信以创建和修改存储库的服务。


函数列表可能如下所示。


对 API 发出的每个请求都有几个移动部分,因此我将其分成多个函数


// github_service.go


package main


// :show (GET) functions

func findGithubRepository(...)

func findGithubRepositoryRequestBuilder(...)

func findGithubRepositoryUrl(...)


// :create (POST) functions

func createGithubRepository(...)

func createGithubRepositoryPayload(...)

func createGithubRepositoryRequestBuilder(...)

func createGithubRepositoryUrl(...)


// :update (PUT) functions

func updateGithubRepository(...)

func updateGithubRepositoryPayload(...)

func updateGithubRepositoryRequestBuilder(...)

func updateGithubRepositoryUrl(...)



// Helpers used by above functions

func queryGithub(...)

func GithubHostName(...)

这种布局有两个问题 -

  1. 所有内容都在一个名为 的大文件中github_service.go,我不知道如何将其拆分。它应该位于较小的子目录中吗services/github/update_service.go一般来说,如何在一个简单的项目中组织这样的服务(例如命令行实用程序)

  2. 由于所有这些都在同一个 Go 包中,因此名称必须是唯一的。所以我有命名空间所有带有操作和上下文的函数(例如findGithubRepositoryUrl()而不是url())。每个都应该在单独的包下吗?。但他们如何分享共同的帮手呢?

谢谢!


喵喵时光机
浏览 120回答 3
3回答

波斯汪

对此有多种解决方案。您可以将所有函数保存在同一个包中的不同文件中。您必须使用详细的名称。您可以为每个资源创建一个结构,并为其定义一组函数:type GithubRepository struct  {}func (g GithubRepository) find() {}func (g GithubRepository) create() {}type GithubRepositoryPayload struct {}func (g GithubRepositoryPayload) find() {}func (g GithubRepositoryPayload) create() {}...这也可以为处理程序提供访问通用功能或变量的方法。您可以使用这些创建一个基本结构并将其嵌入到所有处理程序结构中。

缥缈止盈

为了使项目简单并最大程度地减少文件的多次导入,请将所有文件保存在具有不同文件名的同一包下。示例(假设为 testService):repoName: testServicefolder structure  1.testService(Dir)    2.routes.go    2.commons.go    2.handler.go    2.models.go    2.utils.go  1.main.go  1.Dockerfile这里数字1代表同级,2代表服务目录下的文件

斯蒂芬大帝

您可以使用此结构来组织您的项目如果文件位于同一个包中,则函数名称必须不同。您可以创建名为“helpers”的包并从任何其他包中使用。(不要忘记配置GOPATH环境变量)我已经创建了一个具有此结构的存储库,您可以克隆它并将其用作模板。我希望我有所帮助:)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go