从接口获取接口字段值而不在Golang中声明结构

时间:2017-09-27 11:11:23

标签: go reflection interface

我正在尝试从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获取计数实际值的方法是什么?

1 个答案:

答案 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