如何使用作为接口参数传入的Struct来处理已解码的XML

时间:2014-10-20 12:52:57

标签: go

有没有办法使用作为接口参数传入的struct来操作解码的XML?

我将struct作为具有接口类型的参数传递,但在使用xml.Decode解码后,我无法指定其字段以将其字段检索为结构。我认为go抱怨它不知道要查找哪个结构,除非特别提到它。

以下是一个示例函数:

func UpdateEntity(response *restful.Response, xml_template string, dataStruct interface{}, respStruct interface{}) (*restful.Response, interface{}) {
    payload := renderCachedTemplate(response, xml_template, dataStruct)
    resp, err := http.Post(url, "application/xml", payload)
    if err != nil {
        response.WriteErrorString(http.StatusInternalServerError, err.Error())
        return nil, nil
    }

    defer resp.Body.Close()
    dec := xml.NewDecoder(resp.Body)

    if err = dec.Decode(respStruct); err != nil {
        fmt.Printf("error: %v", err)
        return nil, nil
    }
    return response, respStruct
}

func main() {
   resp, respStruct := UpdateEntity(response, "template.xml", LoginStruct{}, UserStruct{})
   fmt.Println(respStruct.Username)
}

此行fmt.Println(respStruct.Username)抱怨用户名未定义为接口{}没有字段或方法用户名。

我将UserStruct作为其respStruct参数传递,例如具有用户名字段。

有没有办法可以使用interface{}返回变量并使用预定义的Struct字段?

1 个答案:

答案 0 :(得分:2)

更改函数以期望指向值的指针而不是返回值:

func UpdateEntity(response *restful.Response, xml_template string, dataStruct interface{}, respStruct interface{}) *restful.Response {
    payload := renderCachedTemplate(response, xml_template, dataStruct)
    resp, err := http.Post(url, "application/xml", payload)
    if err != nil {
        response.WriteErrorString(http.StatusInternalServerError, err.Error())
        return nil
    }

    defer resp.Body.Close()
    dec := xml.NewDecoder(resp.Body)

    if err = dec.Decode(respStruct); err != nil {
        fmt.Printf("error: %v", err)
        return nil
    }
    return response
}

将指向值的指针传递给函数,然后在函数调用后使用更新的值:

func main() {
   var respStruct UserStruct
   resp := UpdateEntity(response, "template.xml", LoginStruct{}, &respStruct)
   fmt.Println(respStruct.Username)
}

由于Decode方法需要指向某个值的指针,因此此更改还会修复原始代码中的错误。