Я хочу создать structs = каждый тип команды.Как правильно разобрать xml
Команды имеют общую часть xml - CommandResult. Я создал интерфейс Command. Мне нужно SomeCommand реализует команду и может быть проанализирован как xml, также IsError должен быть реализован в CommandResult, другие функции должны быть реализованы SomeCommand.
Код:
type Command interface {
IsError() bool
Request(buf *bufio.Writer, params interface{}) error
...
}
// Result of request
type CommandResult struct {
Code int `xml:"code,attr" json:"code"`
Message string `xml:"msg" json:"msg"`
}
// this Command's func is realized by CommandResult
func (self CommandResult) IsError() bool {
return true
}
// some command
type SomeCommand struct {
CommandResult // CommandResult `xml:"response>result" json:"result"`
}
// this Command's func is realized by SomeCommand
func (self SomeCommand) Request(buf *bufio.Writer, params interface{}) error {
return nil
}
// other Command's functions are realized by CommandResult too
XML:
<epp>
<response>
<result code="1000">
<msg>Command completed successfully</msg>
</result>
<trID>
<svTRID>asd</svTRID>
</trID>
</response>
</epp>
Ожидаемый результат:
a := SomeCommand
xml.NewDecoder(reader).Decode(&a)
// a.CommandResult.Code = 1000
// a.CommandResult.Message = 'Command completed successfully'
// a implements Command
спасибо за ответ. Я все знаю. Основная проблема для меня в том, что функция IsError() должна быть скопирована снова и снова для каждой структуры (SomeCommand, OtherCommand, ...) для реализации командного интерфейса в этом случае. И я не хочу этого делать. – Harlam
@ Харлам Я не понимаю, что вы подразумеваете под «снова и снова». Если вы вставляете 'CommandResult' в' SomeCommand'' SomeCommand' автоматически «загубит» метод IsError. Я добавил полный пример в обновлении. –
Теперь это понятно для меня. Большое спасибо за помощь. – Harlam