Метод reflect.Type.Elem

Метод reflect.Type.Elem возвращает тип элемента составного типа. В первый параметр метод не принимает аргументов и вызывается непосредственно на объекте типа reflect.Type. Он применяется к типам-контейнерам: указателям (*T), массивам ([N]T), срезам ([]T), каналам (chan T) и картам (map[K]V), где возвращается тип значения. Для карт метод возвращает тип значения, а не тип ключа.

Синтаксис

gotypeOf.Elem()

Пример

Давайте получим тип элемента для среза строк:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  slice := []string{"a", "b", "c", "d", "e"}
  typeOf := reflect.TypeOf(slice)

  elemType := typeOf.Elem()
  fmt.Println(elemType)
}

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

gostring

Пример

Давайте получим тип элемента для указателя на структуру:

gopackage 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)
}

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

gomain.User

Пример

Давайте получим тип значения для карты:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  m := map[int]bool{1: true, 2: false}
  typeOf := reflect.TypeOf(m)

  elemType := typeOf.Elem()
  fmt.Println(elemType)
}

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

gobool

Пример

Давайте получим тип элемента для канала:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  ch := make(chan int, 5)
  typeOf := reflect.TypeOf(ch)

  elemType := typeOf.Elem()
  fmt.Println(elemType)
}

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

goint

Пример

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

gopackage 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)
}

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

go"panic: reflect: Elem of invalid type"

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

  • метод reflect.Type.Key,
    который возвращает тип ключа для карт
  • метод reflect.Type.Kind,
    который возвращает базовый вид типа
  • метод reflect.Type.Len,
    который возвращает длину массива
  • функцию reflect.SliceOf,
    которая создает тип среза из другого типа