reflect.Value.MapKeys

Метод reflect.Value.MapKeys возвращает []reflect.Value, содержащий все ключи карты, на которую указывает приемник reflect.Value. Приемник должен иметь вид reflect.Map, иначе метод вызывает панику. Порядок ключей в возвращаемом срезе не детерминирован и зависит от реализации Go.

Синтаксис

gofunc (v Value) MapKeys() []Value

Пример

Получим все ключи из карты с типом map[string]int:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  m := map[string]int{
    "a": 1,
    "b": 2,
    "c": 3,
  }

  v := reflect.ValueOf(m)
  keys := v.MapKeys()

  for _, key := range keys {
    fmt.Println(key.Interface())
  }
}

Результат выполнения кода (порядок может отличаться):

go"a"
"b"
"c"

Пример

Получим ключи из карты с типом map[int]string и преобразуем их в срез целых чисел:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  m := map[int]string{
    10: "ten",
    20: "twenty",
    30: "thirty",
  }

  v := reflect.ValueOf(m)
  keys := v.MapKeys()

  intKeys := make([]int, len(keys))
  for i, key := range keys {
    intKeys[i] = int(key.Int())
  }

  fmt.Println(intKeys)
}

Результат выполнения кода (порядок может отличаться):

go[10 20 30]

Пример

Попытка вызова MapKeys на значении, не являющемся картой, вызывает панику:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  defer func() {
    if r := recover(); r != nil {
      fmt.Println("Panic caught:", r)
    }
  }()

  s := []int{1, 2, 3}
  v := reflect.ValueOf(s)
  _ = v.MapKeys() // panic: reflect: call of MapKeys on slice Value
}

Результат выполнения кода:

go"Panic caught: reflect: call of MapKeys on slice Value"

Смотрите также

  • метод reflect.Value.MapIndex,
    который получает значение по ключу из карты
  • тип reflect.Kind,
    который используется для проверки вида значения
  • функцию reflect.ValueOf,
    которая создает reflect.Value из интерфейса
  • метод reflect.Value.Interface,
    который преобразует reflect.Value обратно в интерфейс