Метод 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,
который возвращает тип элемента указателя или интерфейса