Get Interface Field Values From an Interface Without Declaring Structure in Golang


I am trying to get field values from an interface in Golang. The interface is initially an empty interface which is getting its values from a database result. The DB query is working fine.

The only thing I need is that I need to get the field value of the interface.
Here is my code:

s := reflect.ValueOf(t)
    for i := 0; i < s.Len(); i++ {

where t is an interface having following values:

map[id:null count:1]

I want value of "count" like simply 1.

My problem is that the Index() method is returning a panic because it needs a struct and I dont have any struct here. So what should I do to get interface value? Is there any solution to iterate over an interface to get field values with or without Golang’s reflection package?


After getting the value for count I need to parse it to json.

Here is my code:

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"))

response = ResponseControllerList{
GetResponseList(c, response)

func GetResponseList(c *gin.Context, response ResponseControllerList) {
    c.JSON(200, gin.H{
        "response": response,

The above code is being used to get the ratingCount in JSON format to use this response as API response. In this code, I am using the GIN framework to make HTTP request to API.

Now the problem is that when I am printing the variable ratingsCount, its displaying the exact value of count in terminal what I need. But when I am passing it to JSON, the same variable gives me the response like:

    "response": {
        "code": 200,
        "api_status": 1,
        "message": "Success",
        "total_record": {
            "flag": 148

What is the way to get the count’s actual value in JSON ?


You can use type assertion instead of reflection. It is generally better to avoid reflection whenever you can.

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)

If you really want to use reflection, you can do something like this:

s := reflect.ValueOf(t)
for _, k := range s.MapKeys() {

Update to reply to your latest update

It does not return what you expect because it returns a reflect.Value. If you want an integer value, you have to use ratingsCount.Int().

But as I said before, don’t use reflection. Use the first solution with type assertion and just get the count with m["count"].

I posted working example there using type assertion:

Answered By – R3v4n

Answer Checked By – Marie Seifert (GoLangFix Admin)

Leave a Reply

Your email address will not be published.