首页 > 解决方案 > 当结构包含获取csv数据的接口和范围时如何进行类型转换

问题描述

情况是我在 struct 中有一个接口,现在我必须对数据进行范围以获得 CSV 格式。这是支柱和界面

PaginatedListResponseDataRec struct {
TotalDBRecCnt  int         `json:"totalrecords"`    // total number of records exists in the database.
FilteredRecCnt int         `json:"filteredrecords"` // number of records filtered based on the search criteria
RecList        interface{} `json:"records"`         // list of filtered records
TodayDBRecCnt  int         `json:"todayrecords"`}

现在在这个结构 RecList 中包含我想以 CSV 格式显示的数据。

isSuccess, responseData := dbAccess.GetJobList(reqFilterRec, clientID)

这里 responseData 是 PaginatedListResponseDataRec 结构的类型

    v := reflect.ValueOf(responseData.RecList)
values := make([]interface{}, v.NumField())

for i := 0; i < v.NumField(); i++ {
    values[i] = v.Field(i).Interface()
}

fmt.Println("values: ", values)

这是我用来范围的代码,但这返回错误

exception: &runtime.TypeAssertionError{_interface:(*runtime._type)(0xa458e0), concrete:(*runtime._type)(0xa05960), asserted:(*runtime._type)(0xa05c60), missingMethod:""}

任何人都可以帮助..

标签: go

解决方案


使用反射的切片/数组范围不是用 NumField 和 Field 完成的,它们在结构中使用。你需要的是 Len() 和 Index():

v := reflect.ValueOf(responseData.RecList)
values := make([]interface{}, v.Len())

for i := 0; i < v.Len(); i++ {
    values[i] = v.Index(i).Interface()
}

fmt.Println("values: ", values)

https://golang.org/pkg/reflect/#Value.Len

https://golang.org/pkg/reflect/#Value.Index


推荐阅读