Метод reflect.Value.MapIndex

Метод reflect.Value.MapIndex позволяет получить значение элемента карты по указанному ключу. Он возвращает reflect.Value, представляющее значение, связанное с ключом. Если ключ отсутствует в карте, метод возвращает нулевое значение reflect.Value (его метод IsValid вернет false). Первым параметром метод принимает ключ в виде reflect.Value, а возвращает reflect.Value — значение по этому ключу.

Синтаксис

govalue := mapValue.MapIndex(keyValue)

Пример

Давайте получим значение из карты по ключу "name":

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  m := map[string]int{
    "age":  25,
    "year": 2023,
  }

  val := reflect.ValueOf(m)
  key := reflect.ValueOf("age")
  res := val.MapIndex(key)

  if res.IsValid() {
    fmt.Println(res.Int())
  } else {
    fmt.Println("key not found")
  }
}

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

go25

Пример

Давайте попробуем получить значение по несуществующему ключу:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  m := map[string]int{
    "age": 25,
  }

  val := reflect.ValueOf(m)
  key := reflect.ValueOf("city")
  res := val.MapIndex(key)

  if res.IsValid() {
    fmt.Println(res.Int())
  } else {
    fmt.Println("key not found")
  }
}

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

gokey not found

Пример

Давайте используем карту со сложным типом ключа (структура):

gopackage main

import (
  "fmt"
  "reflect"
)

type Point struct {
  X, Y int
}

func main() {
  m := map[Point]string{
    {1, 2}: "first",
    {3, 4}: "second",
  }

  val := reflect.ValueOf(m)
  key := reflect.ValueOf(Point{1, 2})
  res := val.MapIndex(key)

  if res.IsValid() {
    fmt.Println(res.String())
  }
}

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

gofirst

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

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