我在Service中有一个称为package xyz的结构,多个api包装器(Api1Api2)将用作基础。我希望使用该包的人为每个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.

10-07 19:19