1 回答
TA贡献1995条经验 获得超2个赞
我认为嵌入结构中的路径应该是绝对的,因为所有“父”结构都是“子”的一部分。所以你的
type CommandResult struct {
Code int `xml:"code,attr" json:"code"`
Message string `xml:"msg" json:"msg"`
}
应该更像
type CommandResult struct {
Code int `xml:"response>result>code,attr" json:"code"`
Message string `xml:"response>result>msg" json:"msg"`
}
但!我们正面临着 Go 的局限性。
您不能attr与链接一起使用。Github 上有问题,但看起来不在优先级列表中。因此,如果我正确理解您的CommandResult声明的最短版本将是:
type CommandResult struct {
Result struct {
Code int `xml:"code,attr" json:"code"`
Message string `xml:"msg" json:"msg"`
} `xml:"response>result" json:"response"`
}
不是一个真正的问题,但如果您决定转换Command回 XML 会很好地声明它的XMLName. 就像是
type CommandResult struct {
XMLName xml.Name `xml:"epp"`
Result struct {
Code int `xml:"code,attr" json:"code"`
Message string `xml:"msg" json:"msg"`
} `xml:"response>result" json:"response"`
}
因为没有它 XML 编码器会产生类似 <SomeCommand><response>...</response></SomeCommand>
使用完整示例更新
package main
import (
"bufio"
"encoding/xml"
"log"
)
type Command interface {
IsError() bool
Request(buf *bufio.Writer, params interface{}) error
}
// Result of request
type CommandResult struct {
XMLName xml.Name `xml:"epp"`
Result struct {
Code int `xml:"code,attr" json:"code"`
Message string `xml:"msg" json:"msg"`
} `xml:"response>result" json:"response"`
}
// this Command's func is realized by CommandResult
func (self CommandResult) IsError() bool {
return true
}
// some command
type SomeCommand struct {
CommandResult
}
// this Command's func is realized by SomeCommand
func (self SomeCommand) Request(buf *bufio.Writer, params interface{}) error {
return nil
}
type AnotherCommand struct {
CommandResult
}
func (self AnotherCommand) Request(buf *bufio.Writer, params interface{}) error {
return nil
}
func main() {
var c Command
c = SomeCommand{}
log.Println(c.IsError())
c = AnotherCommand{}
log.Println(c.IsError())
}
- 1 回答
- 0 关注
- 160 浏览
添加回答
举报