type Resp struct {
Count string `xml:"totalRows"`
Records []interface{} `xml:"data>record"`
}
type DepartmentRecord struct {
DepID string `xml:"IDFIELD"`
}
type PersonRecord struct {
UserID string `xml:"IDFIELD"`
}
我正在寻找一种方法来传递到 xml.Unmarshal Resp 结构中,该结构已更改为所需的记录类型。
最佳答案
首先,如果您想将不同类型的 slice 值分配给一个字段,您应该使用 interface{}
而不是 []interface{}
作为类型字段,否则您必须手动将 slice 中的每个元素转换为界面。
type Resp struct {
Count string `xml:"totalRows"`
Records interface{} `xml:"data>record"`
}
现在,由于字段的类型是 interface{}
,xml 解码器本身并不知道如何解码 xml 数据,因此该字段保持不变和未填充。要解决此问题,您可以通过预分配所需类型的值并将其分配给字段来协助解码器。
resp := new(Resp)
resp.Records = new([]DepartmentRecord)
xml.Unmarshal(data, resp)
或者,如果您想避免对 Records
字段进行解码后类型断言,请分配一个变量,将其分配给该字段,并在解码后使用该变量。
resp := new(Resp)
records := new([]DepartmentRecord)
resp.Records = records
xml.Unmarshal(data, resp)
// records is now populated and ready for use
请注意,我有意在 slice 类型上使用 new
而不是通常的 make
,这是因为 new
返回分配的指向传入类型的零值的指针,我相信 xml 解码器需要 interface{}
字段的基础类型是指针类型而不是值类型,这就是 make
会返回。因此,在您使用记录 slice 之前,您需要取消引用它,因为它实际上是一个指针。
recs := *records
我猜上面的一个更好的版本应该是这样的:
resp := new(Resp)
records := make([]DepartmentRecord, 0)
resp.Records = &records
xml.Unmarshal(data, resp)
// records is now populated and ready for use
关于xml - Golang XML 解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50030691/