Вы пытаетесь внедрить систему стилей наследования в go.Структурное вложение не является наследованием и не должно рассматриваться или рассматриваться как таковое.Это анти-паттерн на ходу и, как правило, он не работает так, как вы бы этого хотели или ожидаете.
Вместо этого, более идиоматическим подходом к этому будет определение интерфейса (или пары интерфейсов) и получение вашего ответаТипы реализуют необходимые методы для соответствия.
type ApiReply interface {
Status() (string, string)
Body() (io.Reader, error)
}
type BizError struct {
Code string
Mesg string
}
func (b BizError) Status() (string, string) {
return b.Code, b.Mesg
}
func (b BizError) Body() (io.Reader, error) {
return nil, errors.New("BizError never contains a body")
}
Затем вы реализуете ApiReply
для других структур типов ответов.Я, конечно, догадываюсь о том, что вам на самом деле нужно здесь, но, надеюсь, это поможет понять.
И если вы обнаружите, что должны это сделать, теперь вы можете выполнить переключение типов против экземпляра ApiReply
, который вы получаете, и специальногоcase любые базовые типы, если это абсолютно необходимо.