为了账号安全,请及时绑定邮箱和手机立即绑定

Go:将 XML 解组嵌套结构到接口{}

Go:将 XML 解组嵌套结构到接口{}

Go
郎朗坤 2021-09-13 09:55:33
我来自 Python 背景,这是我第一次正式涉足 Go,所以我认为事情还没有开始。我目前正在 Go 中实现 Affiliate Window XML API。API 遵循请求和响应的标准结构,因此为此我试图保持干燥。信封始终具有相同的结构,如下所示:<Envelope>    <Header></Header>    <Body></Body></Envelope>内容Header和Body依据是什么,我请求,将是不同的反应,所以我创建了一个基地Envelope structtype Envelope struct {    XMLName xml.Name    `xml:"http://schemas.xmlsoap.org/soap/envelope/ Envelope"`    NS1     string      `xml:"xmlns:ns1,attr"`    XSD     string      `xml:"xmlns:xsd,attr"`    Header  interface{} `xml:"http://schemas.xmlsoap.org/soap/envelope/ Header"`    Body    interface{} `xml:"Body"`}这适用于为请求编组 XML,但我在解组时遇到问题:func NewResponseEnvelope(body interface{}) *Envelope {    envelope := NewEnvelope()    envelope.Header = &ResponseHeader{}    envelope.Body = body    return envelope}func main() {    responseBody := &GetMerchantListResponseBody{}    responseEnvelope := NewResponseEnvelope(responseBody)    b := bytes.NewBufferString(response)    xml.NewDecoder(b).Decode(responseEnvelope)    fmt.Println(responseEnvelope.Header.Quota) // Why can't I access this?}这个http://play.golang.org/p/v-MkfEyFPM在代码中可能比我用文字更好地描述了这个问题:p
查看完整描述

1 回答

?
动漫人物

TA贡献1815条经验 获得超10个赞

该类型的Header内场Envelope结构是interface{}它是不是一个struct,所以你不能引用任何字段。


为了引用名为 的字段Quota,您必须Header使用包含Quota字段的静态类型进行声明,如下所示:


type HeaderStruct struct {

    Quota string

}


type Envelope struct {

    // other fields omitted

    Header HeaderStruct

}

如果您不知道它将是什么类型或者您不能提交单一类型,您可以将其保留为interface{},但是您必须使用类型开关或类型断言在运行时将其转换为静态类型,后者看起来像这样:


headerStruct, ok := responseEnvelope.Header.(HeaderStruct)

// if ok is true, headerStruct is of type HeaderStruct

// else responseEnvelope.Header is not of type HeaderStruct

另一种选择是使用反射来访问Envelope.Header值的命名字段,但如果可能,请尝试以其他方式解决它。如果您有兴趣了解有关 Go 反射的更多信息,我建议您先阅读The Laws of Reflection博客文章。


查看完整回答
反对 回复 2021-09-13
  • 1 回答
  • 0 关注
  • 192 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信