Функция reflect.MapOf
Функция reflect.MapOf создает тип карты (map) с указанными типами ключа и значения.
В первый параметр передается reflect.Type, представляющий тип ключа карты, а во второй
параметр передается reflect.Type, представляющий тип значения. Функция возвращает
reflect.Type, который представляет тип карты, соответствующий переданным типам.
Синтаксис
reflect.MapOf(keyType, elemType)
Пример 1 - создание типа карты с целочисленным ключом и строковым значением
Давайте создадим тип карты, где ключом является тип int, а значением - тип string:
package 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)
}
Результат выполнения кода:
"Key type: int"
"Element type: string"
"Map type: map[int]string"
Пример 2 - создание карты с помощью reflect.MapOf и reflect.MakeMap
Давайте создадим пустую карту с помощью reflect.MapOf и reflect.MakeMap:
package 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())
}
Результат выполнения кода:
"Map type: map[string]int"
"Is map valid: true"
"Map length: 0"
Пример 3 - работа с картой через reflect.Value
Давайте создадим карту с помощью reflect.MapOf, добавим в нее элементы
и получим значение по ключу:
package 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))
}
Результат выполнения кода:
"Map type: map[string]int"
"Map length: 2"
"Value by key 'first': 100"
"Value by key 'second': 200"
Пример 4 - проверка типа созданной карты
Давайте проверим, что созданный тип действительно является типом карты,
и определим его ключ и значение с помощью методов Key и Elem:
package 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)
}
Результат выполнения кода:
"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,
который возвращает тип элемента карты, среза или массива