Метод reflect.Value.Elem

Метод reflect.Value.Elem возвращает reflect.Value, представляющее значение, на которое указывает указатель, или значение, хранящееся в интерфейсе. Если метод вызван на значении, которое не является указателем или интерфейсом, возникает паника. Этот метод часто используется для изменения значений переданных по указателю.

Синтаксис

goelem := val.Elem()

Пример 1

Давайте получим значение, на которое указывает указатель на целое число:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  x := 42
  ptr := &x
  val := reflect.ValueOf(ptr)
  elem := val.Elem()

  fmt.Printf("Тип: %v, Значение: %v\n", elem.Kind(), elem.Int())
}

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

go"Тип: int, Значение: 42"

Пример 2

Изменим значение переменной через указатель, полученный с помощью рефлексии:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  x := 10
  val := reflect.ValueOf(&x)

  if val.Kind() == reflect.Ptr && val.Elem().CanSet() {
    val.Elem().SetInt(100)
  }

  fmt.Println(x)
}

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

go"100"

Пример 3

Получим значение из интерфейса с помощью Elem:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  var i interface{} = "hello"
  val := reflect.ValueOf(i)
  elem := val.Elem()

  fmt.Printf("Тип: %v, Значение: %v\n", elem.Kind(), elem.String())
}

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

go"Тип: string, Значение: hello"

Пример 4

Обработка случая, когда Elem вызывается на не-указателе:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  x := 42
  val := reflect.ValueOf(x)

  defer func() {
    if r := recover(); r != nil {
      fmt.Println("panic:", r)
    }
  }()

  _ = val.Elem()
}

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

go"panic: reflect: call of reflect.Value.Elem on int Value"

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

  • функцию reflect.ValueOf,
    которая создает reflect.Value из любого значения
  • метод reflect.Value.CanSet,
    который проверяет возможность изменения значения
  • метод reflect.Value.Set,
    который устанавливает новое значение для reflect.Value
  • метод reflect.Type.Elem,
    который возвращает тип элемента указателя или интерфейса