2015-05-18 38 views
2

我在package xyz中有一个名为Service的结构,其中多个API封装(Api1,Api2)将用作基础。我想谁在使用包调用像每个API方法的人:xyz.Api1.MethodA(..)xyz.Api2.MethodB(..)Go结构类型在一个已经键入的结构上

现在我做这样的事情

type struct api1 { 
    *Service 
} 

var Api1 *api1 

func init() { 
    Api1 = &api1{ 
     &Service{ 
      ... 
     } 
    } 
} 

func (a *api1) MethodA { 
    ... 
} 

我不是这一点,因为它的风扇看起来像很多样板。我宁愿让Api1成为一个Service结构,但每个服务都会有不同的方法,所以我不认为这是可能的,除非我能做到type Service api1 {...}

是否有另一种方法可以让用户获得期望的呼叫类似xyz.Api1.MethodA(..)而不必为每个API创建新的结构类型,并且没有太多的样板文件?

+0

为什么不干脆让'API1 '和'api2'分开包?另外,API上的方法是否以任何方式使用'Service'? –

+0

是的,有些方法会调用'Service'方法。如果我要将'api1'和'api2'分离到它们自己的包中,我可以参考将在父包中的'Service'吗?或者我想问题是,导入可以使用相对路径,例如'进口“../ xyz”'? –

+1

建议不要因为各种原因使用相对路径,但是,您可以使用它。另一种可能性是创建两个新的导出类型“API1Service”和“API2Service”,在它们上定义方法,并让用户实例化这些类型并使用它们。 –

回答

2

而不是使用全局变量你可以创建两个新的类型,并让用户决定如何使用它们的:

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.