Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to check interface is a map[string]string in golang

Tags:

reflection

go

I want to check the output variable is map[string]string or not. the output should be a map[string]string and it should be a ptr.

I checked ptr value. But I don't know how to check the key of map if is string or not.

sorry for my bad english

import (
    "fmt"
    "reflect"
)

func Decode(filename string, output interface{}) error {
    rv := reflect.ValueOf(output)
    if rv.Kind() != reflect.Ptr {
        return fmt.Errorf("Output should be a pointer of a map")
    }
    if rv.IsNil() {
        return fmt.Errorf("Output in NIL")
    }
    fmt.Println(reflect.TypeOf(output).Kind())
    return nil
}
like image 962
ahmdrz Avatar asked Nov 02 '16 16:11

ahmdrz


1 Answers

You don't have to use reflect at all for this. A simple type assert will suffice;

unboxed, ok := output.(*map[string]string)
if !ok {
    return fmt.Errorf("Output should be a pointer of a map")
}
if unboxed == nil {
    return fmt.Errorf("Output in NIL")
}
// if I get here unboxed is a *map[string]string and is not nil
like image 66
evanmcdonnal Avatar answered Oct 10 '22 05:10

evanmcdonnal