Метод reflect.Value.Set
Метод Set объекта reflect.Value устанавливает новое значение для переменной, на которую указывает приемник. В качестве аргумента метод принимает другое значение reflect.Value, которое должно быть присваиваемо типу исходного значения. Важно помнить, что метод Set работает только с адресуемыми значениями, то есть теми, которые можно изменить. Проверить адресуемость можно с помощью метода CanSet.
Метод вызывает панику, если значение не адресуемо или если типы передаваемого значения и приемника не совместимы для присваивания. Для корректной работы необходимо, чтобы передаваемое значение было того же типа, что и приемник, либо могло быть преобразовано к нему.
Синтаксис
func (v Value) Set(x Value)
Пример
Давайте изменим значение переменной типа string с помощью отражения:
package main
import (
"fmt"
"reflect"
)
func main() {
var s string = "abcde"
val := reflect.ValueOf(&s).Elem()
if val.CanSet() {
newVal := reflect.ValueOf("12345")
val.Set(newVal)
}
fmt.Println(s)
}
Результат выполнения кода:
"12345"
Пример
Теперь изменим значение целочисленной переменной:
package main
import (
"fmt"
"reflect"
)
func main() {
var num int = 10
val := reflect.ValueOf(&num).Elem()
if val.CanSet() {
newVal := reflect.ValueOf(42)
val.Set(newVal)
}
fmt.Println(num)
}
Результат выполнения кода:
42
Пример
Попытка установить значение для неадресуемой переменной вызовет панику. Давайте посмотрим на это на примере:
package main
import (
"fmt"
"reflect"
)
func main() {
var s string = "abcde"
val := reflect.ValueOf(s)
if val.CanSet() {
newVal := reflect.ValueOf("12345")
val.Set(newVal)
} else {
fmt.Println("value is not settable")
}
}
Результат выполнения кода:
"value is not settable"
Смотрите также
-
метод
reflect.Value.CanSet,
который проверяет, можно ли изменить значение -
метод
reflect.Value.SetInt,
который устанавливает целочисленное значение -
метод
reflect.Value.SetString,
который устанавливает строковое значение -
функцию
reflect.ValueOf,
которая создает значениеreflect.Valueиз интерфейса