我正在尝试从Golang中的接口获取字段值。该接口最初是一个空接口,它从数据库结果中获取其值。数据库查询工作正常。
我唯一需要的是我需要获取界面的字段值。 这是我的代码:
s := reflect.ValueOf(t)
for i := 0; i < s.Len(); i++ {
fmt.Println(s.Index(i))
}
其中t是具有以下值的接口:
map[id:null count:1]
我希望"count"
的价值仅为1。
我的问题是Index()方法返回一个恐慌,因为它需要一个结构,我这里没有任何结构。那么我该怎么做才能获得界面价值呢?是否有任何解决方案可以迭代一个接口来获取带或不带Golang反射包的字段值?
修改
获取count的值后,我需要将其解析为json。
这是我的代码:
type ResponseControllerList struct{
Code int `json:"code"`
ApiStatus int `json:"api_status"`
Message string `json:"message"`
Data interface{} `json:"data,omitempty"`
TotalRecord interface{} `json:"total_record,omitempty"`
}
response := ResponseControllerList{}
ratingsCount := reflect.ValueOf(ratingsCountInterface).MapIndex(reflect.ValueOf("count"))
fmt.Println(ratingsCount)
response = ResponseControllerList{
200,
1,
"success",
nil,
ratingsCount,
}
GetResponseList(c, response)
func GetResponseList(c *gin.Context, response ResponseControllerList) {
c.JSON(200, gin.H{
"response": response,
})
}
以上代码用于获取JSON格式的ratingCount
,以将此响应用作API响应。在这段代码中,我使用GIN框架向API发出HTTP请求。
现在的问题是,当我打印变量ratingsCount
时,它会在终端显示我需要的精确计数值。但是当我将它传递给JSON时,同一个变量给我的反应如下:
{
"response": {
"code": 200,
"api_status": 1,
"message": "Success",
"total_record": {
"flag": 148
}
}
}
用JSON获取计数实际值的方法是什么?
答案 0 :(得分:5)
您可以使用类型断言而不是反射。通常情况下,最好避免反射。
m, ok := t.(map[string]interface{})
if !ok {
return fmt.Errorf("want type map[string]interface{}; got %T", t)
}
for k, v := range m {
fmt.Println(k, "=>", v)
}
如果你真的想使用反射,你可以这样做:
s := reflect.ValueOf(t)
for _, k := range s.MapKeys() {
fmt.Println(s.MapIndex(k))
}
更新以回复您的最新更新
它不会返回您期望的内容,因为它返回reflect.Value
。如果需要整数值,则必须使用ratingsCount.Int()
。
但正如我之前所说,不要使用反射。使用带有类型断言的第一个解决方案,然后使用m["count"]
获取计数。
我使用类型断言发布了工作示例:https://play.golang.org/p/9gzwtJIfd7