【问题标题】:SOO Go Subpackage NamingSOO Go 子包命名
【发布时间】:2016-03-09 16:28:11
【问题描述】:

我正在将一个大型 Web 应用程序移植到 Go。为了管理复杂性并提高可测试性,我们采用了面向服务的架构。我正在尝试找出最清晰的方法来命名和构建包,这样任何服务都不知道其他服务的实现,并且我可以在应用程序级别将它们区分开来。请允许我举个例子:

FooService

package api

type FooService interface {
    foo()
}

FooService 实现

package implementation

import (
    "fmt"
    _ "github.com/user/foo/api"
)

type FooImplementation struct {
}

func (self FooImplementation) foo() {
    fmt.Println("foo")
}

在我的应用程序中,我需要将此实现绑定到接口以及许多其他接口。但它们不能都被命名为 api/implementation。我是否也将包命名为 fooapi 和 fooimplementation?或者有没有更好的方法来构建我的应用程序? 谢谢!

【问题讨论】:

  • 如果服务实现在同一个包github.com/user/foo中会有什么问题?您仍然可以在其他包或测试中提供不同的实现吗?并非所有最佳实践都来自例如Java 延续到 Go。
  • 还可以看看 golang.org/x/oauth2 是如何组织的。
  • 只需将您的 API 和实现放在同一个包中,只导出公共 API 中的标识符。
  • Aedolon - 这就是我现在正在做的事情。我将 foo 服务和实现都作为 foo 包的一部分,然后对于服务,我将导入“github.com/user/foo/api”,但对于我需要两者的包,例如main,我会在导入时重命名它们。

标签: go package


【解决方案1】:

我找到了一个潜在的解决方法,但我不会将其标记为已关闭,因为它并不理想。我发现你可以命名你的导入来消除同名包的歧义。例如

import (
fapi "github.com/user/foo/api"
fimplementation "github.com/user/foo/implementation"
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    • 2021-08-09
    • 2014-01-15
    • 1970-01-01
    • 2013-11-28
    相关资源
    最近更新 更多