Search code examples
goreflectionreflect

Print the key/value types of a Golang map


I am trying to print the type of a map, eg: map[int]string

func handleMap(m reflect.Value) string {

    keys := m.MapKeys()
    n := len(keys)

    keyType := reflect.ValueOf(keys).Type().Elem().String()
    valType := m.Type().Elem().String()

    return fmt.Sprintf("map[%s]%s>", keyType, valType)
}

so if I do:

log.Println(handleMap(make(map[int]string)))

I want to get "map[int]string"

but I can't figure out the right calls to make.


Solution

  • Try not to use reflect. But if you must use reflect:

    • A reflect.Value value has a Type() function, which returns a reflect.Type value.
    • If that type's Kind() is reflect.Map, that reflect.Value is a value of type map[T1]T2 for some types T1 and T2, where T1 is the key type and T2 is the element type.

    Therefore, when using reflect, we can pull apart the pieces like this:

    func show(m reflect.Value) {
        t := m.Type()
        if t.Kind() != reflect.Map {
            panic("not a map")
        }
        kt := t.Key()
        et := t.Elem()
        fmt.Printf("m = map from %s to %s\n", kt, et)
    }
    

    See a more complete example on the Go Playground. (Note that both maps are actually nil, so there are no keys and values to enumerate.)