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

Метод reflect.Value.Addr

Метод reflect.Value.Addr возвращает новое значение типа reflect.Value, которое представляет собой указатель на значение, хранящееся в исходном reflect.Value. Этот метод полезен, когда необходимо получить доступ к адресу переменной для её последующего изменения через отражение. Важно: метод работает только с адресуемыми значениями, то есть с теми, которые могут быть изменены. Если вызвать метод на неадресуемом значении, возникнет паника.

Синтаксис

reflect.Value.Addr()

Пример

Давайте получим указатель на значение переменной и изменим её через отражение:

package main import ( "fmt" "reflect" ) func main() { x := 42 val := reflect.ValueOf(&x).Elem() ptr := val.Addr() ptr.Elem().SetInt(100) fmt.Println(x) }

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

100

Пример

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

package main import ( "fmt" "reflect" ) type User struct { Name string Age int } func main() { user := User{Name: "John", Age: 30} val := reflect.ValueOf(&user).Elem() field := val.FieldByName("Age") ptr := field.Addr() ptr.Elem().SetInt(35) fmt.Println(user.Age) }

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

35

Пример

Попытка вызова метода на неадресуемом значении приведёт к панике:

package main import ( "fmt" "reflect" ) func main() { x := 42 val := reflect.ValueOf(x) defer func() { if r := recover(); r != nil { fmt.Println("Panic:", r) } }() ptr := val.Addr() ptr.Elem().SetInt(100) }

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

"Panic: reflect.Value.Addr of unaddressable value"

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

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