在已经键入的结构上执行结构类型

I have a struct called Service in package xyz which multiple api wrappers (Api1, Api2) will use as a base. I want someone who is using the package to call the methods for each API like: xyz.Api1.MethodA(..) and xyz.Api2.MethodB(..)

Right now I'm doing something like this

type struct api1 {
    *Service
}

var Api1 *api1

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

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

I'm not a fan of this because it seems like a lot of boilerplate. I would rather have Api1 be a Service struct but each service will have different methods so I don't think that's possible unless I could do type Service api1 {...}?

Is there another way to get the desired call by a user to be something like xyz.Api1.MethodA(..) without having to create a new struct type for each api and without having so much boilerplate?

Instead of using global variables you can just create two new types and let users decide how to use them:

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

Then, your users can do

api := xyz.NewAPI1Service(42)
api.MethodA()
// etc.