Метод reflect.Type.Elem
Метод reflect.Type.Elem возвращает тип элемента составного типа.
В первый параметр метод не принимает аргументов и вызывается непосредственно
на объекте типа reflect.Type. Он применяется к типам-контейнерам:
указателям (*T), массивам ([N]T), срезам ([]T),
каналам (chan T) и картам (map[K]V), где возвращается
тип значения. Для карт метод возвращает тип значения, а не тип ключа.
Синтаксис
typeOf.Elem()
Пример
Давайте получим тип элемента для среза строк:
package main
import (
"fmt"
"reflect"
)
func main() {
slice := []string{"a", "b", "c", "d", "e"}
typeOf := reflect.TypeOf(slice)
elemType := typeOf.Elem()
fmt.Println(elemType)
}
Результат выполнения кода:
string
Пример
Давайте получим тип элемента для указателя на структуру:
package main
import (
"fmt"
"reflect"
)
type User struct {
Name string
Age int
}
func main() {
ptr := &User{}
typeOf := reflect.TypeOf(ptr)
elemType := typeOf.Elem()
fmt.Println(elemType)
}
Результат выполнения кода:
main.User
Пример
Давайте получим тип значения для карты:
package main
import (
"fmt"
"reflect"
)
func main() {
m := map[int]bool{1: true, 2: false}
typeOf := reflect.TypeOf(m)
elemType := typeOf.Elem()
fmt.Println(elemType)
}
Результат выполнения кода:
bool
Пример
Давайте получим тип элемента для канала:
package main
import (
"fmt"
"reflect"
)
func main() {
ch := make(chan int, 5)
typeOf := reflect.TypeOf(ch)
elemType := typeOf.Elem()
fmt.Println(elemType)
}
Результат выполнения кода:
int
Пример
Давайте обработаем случай, когда метод Elem вызывается
на типе, не являющемся составным:
package main
import (
"fmt"
"reflect"
)
func main() {
num := 42
typeOf := reflect.TypeOf(num)
defer func() {
if r := recover(); r != nil {
fmt.Println("panic:", r)
}
}()
elemType := typeOf.Elem()
fmt.Println(elemType)
}
Результат выполнения кода:
"panic: reflect: Elem of invalid type"
Смотрите также
-
метод
reflect.Type.Key,
который возвращает тип ключа для карт -
метод
reflect.Type.Kind,
который возвращает базовый вид типа -
метод
reflect.Type.Len,
который возвращает длину массива -
функцию
reflect.SliceOf,
которая создает тип среза из другого типа