reflect.Value.MapKeys
Метод reflect.Value.MapKeys возвращает []reflect.Value,
содержащий все ключи карты, на которую указывает
приемник reflect.Value. Приемник должен иметь вид
reflect.Map, иначе метод вызывает панику.
Порядок ключей в возвращаемом срезе не детерминирован
и зависит от реализации Go.
Синтаксис
func (v Value) MapKeys() []Value
Пример
Получим все ключи из карты с типом map[string]int:
package 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())
}
}
Результат выполнения кода (порядок может отличаться):
"a"
"b"
"c"
Пример
Получим ключи из карты с типом map[int]string и преобразуем их в срез целых чисел:
package 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)
}
Результат выполнения кода (порядок может отличаться):
[10 20 30]
Пример
Попытка вызова MapKeys на значении, не являющемся картой, вызывает панику:
package 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
}
Результат выполнения кода:
"Panic caught: reflect: call of MapKeys on slice Value"
Смотрите также
-
метод
reflect.Value.MapIndex,
который получает значение по ключу из карты -
тип
reflect.Kind,
который используется для проверки вида значения -
функцию
reflect.ValueOf,
которая создаетreflect.Valueиз интерфейса -
метод
reflect.Value.Interface,
который преобразуетreflect.Valueобратно в интерфейс