Функция reflect.MapOf

Функция reflect.MapOf создает тип карты (map) с указанными типами ключа и значения. В первый параметр передается reflect.Type, представляющий тип ключа карты, а во второй параметр передается reflect.Type, представляющий тип значения. Функция возвращает reflect.Type, который представляет тип карты, соответствующий переданным типам.

Синтаксис

goreflect.MapOf(keyType, elemType)

Пример 1 - создание типа карты с целочисленным ключом и строковым значением

Давайте создадим тип карты, где ключом является тип int, а значением - тип string:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  keyType := reflect.TypeOf(0)
  elemType := reflect.TypeOf("")
  mapType := reflect.MapOf(keyType, elemType)

  fmt.Println("Key type:", keyType)
  fmt.Println("Element type:", elemType)
  fmt.Println("Map type:", mapType)
}

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

go"Key type: int"
"Element type: string"
"Map type: map[int]string"

Пример 2 - создание карты с помощью reflect.MapOf и reflect.MakeMap

Давайте создадим пустую карту с помощью reflect.MapOf и reflect.MakeMap:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  keyType := reflect.TypeOf("")
  elemType := reflect.TypeOf(0)
  mapType := reflect.MapOf(keyType, elemType)
  mapValue := reflect.MakeMap(mapType)

  fmt.Println("Map type:", mapType)
  fmt.Println("Is map valid:", mapValue.IsValid())
  fmt.Println("Map length:", mapValue.Len())
}

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

go"Map type: map[string]int"
"Is map valid: true"
"Map length: 0"

Пример 3 - работа с картой через reflect.Value

Давайте создадим карту с помощью reflect.MapOf, добавим в нее элементы и получим значение по ключу:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  keyType := reflect.TypeOf("key")
  elemType := reflect.TypeOf(42)
  mapType := reflect.MapOf(keyType, elemType)
  mapValue := reflect.MakeMap(mapType)

  key := reflect.ValueOf("first")
  val := reflect.ValueOf(100)
  mapValue.SetMapIndex(key, val)

  key2 := reflect.ValueOf("second")
  val2 := reflect.ValueOf(200)
  mapValue.SetMapIndex(key2, val2)

  fmt.Println("Map type:", mapType)
  fmt.Println("Map length:", mapValue.Len())
  fmt.Println("Value by key 'first':", mapValue.MapIndex(key))
  fmt.Println("Value by key 'second':", mapValue.MapIndex(key2))
}

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

go"Map type: map[string]int"
"Map length: 2"
"Value by key 'first': 100"
"Value by key 'second': 200"

Пример 4 - проверка типа созданной карты

Давайте проверим, что созданный тип действительно является типом карты, и определим его ключ и значение с помощью методов Key и Elem:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  keyType := reflect.TypeOf(true)
  elemType := reflect.TypeOf(3.14)
  mapType := reflect.MapOf(keyType, elemType)

  fmt.Println("Is map type:", mapType.Kind() == reflect.Map)
  fmt.Println("Key type:", mapType.Key())
  fmt.Println("Element type:", mapType.Elem())
  fmt.Println("Full type:", mapType)
}

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

go"Is map type: true"
"Key type: bool"
"Element type: float64"
"Full type: map[bool]float64"

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

  • функцию reflect.MakeMap,
    которая создает новое значение карты на основе типа
  • функцию reflect.TypeOf,
    которая возвращает тип переданного значения
  • метод reflect.Type.Key,
    который возвращает тип ключа карты
  • метод reflect.Type.Elem,
    который возвращает тип элемента карты, среза или массива