2015-05-18 60 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.