SOO Go子包命名

SOO Go子包命名,go,package,Go,Package,我正在移植一个大型web应用程序。为了管理复杂性和增加可测试性,我们采用了面向服务的体系结构。我试图找出命名和构造包的最清晰的方法,这样就没有任何服务知道其他服务的实现,并且我可以在应用程序级别区分它们。请允许我举一个例子: 餐饮服务 package api type FooService interface { foo() } FooService实现 package implementation import ( "fmt" _ "github.com/user

我正在移植一个大型web应用程序。为了管理复杂性和增加可测试性,我们采用了面向服务的体系结构。我试图找出命名和构造包的最清晰的方法,这样就没有任何服务知道其他服务的实现,并且我可以在应用程序级别区分它们。请允许我举一个例子:

餐饮服务

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/实现。我是否也将包命名为fooapi和fooimplementation?还是有更好的方法来构造我的应用程序?
谢谢

我找到了一个潜在的解决方法,但我不打算将其标记为关闭,因为这并不理想。我发现,您可以命名您的导入以消除使用相同名称的包的歧义。例如

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

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