Во-первых, если вы хотите присвоить значениям срезов различных типов для поля, вы должны использовать interface{}
вместо []interface{}
в качестве типа поля, иначе вам придется преобразовать каждый элемент в срезе для интерфейсавручную.
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)
Или, если вы хотите избежать пост-утверждение типа unmarshal в поле Records
, выделите переменную, назначьте это поле, и после unmarshal используйте переменную.
resp := new(Resp)
records := new([]DepartmentRecord)
resp.Records = records
xml.Unmarshal(data, resp)
// records is now populated and ready for use
Обратите внимание, что я намеренно использую new
для типа срезав отличие от обычного make
, это потому, что new
возвращает выделенный указатель на нулевое значение переданного типа, и, я полагаю, xml-декодеру нужен базовый тип полей interface{}
, чтобы быть типами указателя какв отличие от типов значений, которые make
будет возвращать.Поэтому, прежде чем использовать срез записи, вам нужно разыменовать его, так как он фактически является указателем.
recs := *records
Полагаю, что более приятная версия приведенного выше будет выглядеть примерно так:
resp := new(Resp)
records := make([]DepartmentRecord, 0)
resp.Records = &records
xml.Unmarshal(data, resp)
// records is now populated and ready for use
https://play.golang.org/p/FHEco6C69jw