Распечатать ключ / значение типа карты Golang - PullRequest
0 голосов
/ 16 февраля 2020

Я пытаюсь напечатать тип карты, например: 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)
}

, поэтому, если я сделаю:

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

Я хочу получить "map[int]string"

, но я не могу понять, как правильно звонить.

Ответы [ 2 ]

1 голос
/ 16 февраля 2020
func handleMap(m interface{}) string {
    return fmt.Sprintf("%T", m)
}
1 голос
/ 16 февраля 2020

Старайтесь не использовать reflect. Но если вы должны использовать reflect:

  • A reflect.Value значение имеет функцию Type(), которая возвращает значение reflect.Type.
  • Если Kind() этого типа равно reflect.Map, то reflect.Value является значением типа map[T1]T2 для некоторых типов T1 и T2, где T1 - тип ключа, а T2 - тип элемента.

Поэтому, используя reflect, мы можем разделить части следующим образом:

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

Смотрите более полный пример на Go Playground . (Обратите внимание, что обе карты на самом деле равны нулю, поэтому нет никаких ключей и значений для перечисления.)

...