РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1505 of 1593 menu

Метод reflect.Value.Elem

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

Синтаксис

elem := val.Elem()

Пример 1

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

package 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()) }

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

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

Пример 2

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

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

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

"100"

Пример 3

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

package 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()) }

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

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

Пример 4

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

package 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() }

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

"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,
    который возвращает тип элемента указателя или интерфейса
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить