我在Service
中有一个称为package xyz
的结构,多个api包装器(Api1
,Api2
)将用作基础。我希望使用该包的人为每个API调用方法,例如:xyz.Api1.MethodA(..)
和xyz.Api2.MethodB(..)
现在我正在做这样的事情
type struct api1 {
*Service
}
var Api1 *api1
func init() {
Api1 = &api1{
&Service{
...
}
}
}
func (a *api1) MethodA {
...
}
我不喜欢这个,因为它看起来像很多样板。我宁愿将Api1用作Service struct,但每个服务将具有不同的方法,因此除非我可以执行
type Service api1 {...}
,否则我认为这不可能。是否有另一种方法可以使用户获得所需的调用,例如
xyz.Api1.MethodA(..)
,而不必为每个api创建新的结构类型,而无需创建太多样板文件? 最佳答案
除了使用全局变量,您还可以创建两个新类型,然后让用户决定如何使用它们:
type API1Service struct {
*Service
api1Param1 int
// etc.
}
func NewAPI1Service(api1Param1 int) *API1Service { /* ... */ }
// methods on API1Service
type API2Service struct {
*Service
api2Param1 int
// etc.
}
func NewAPI2Service(api2Param1 int) *API2Service { /* ... */ }
// methods on API2Service
然后,您的用户可以
api := xyz.NewAPI1Service(42)
api.MethodA()
// etc.