Метод reflect.Value.Set

Метод Set объекта reflect.Value устанавливает новое значение для переменной, на которую указывает приемник. В качестве аргумента метод принимает другое значение reflect.Value, которое должно быть присваиваемо типу исходного значения. Важно помнить, что метод Set работает только с адресуемыми значениями, то есть теми, которые можно изменить. Проверить адресуемость можно с помощью метода CanSet.

Метод вызывает панику, если значение не адресуемо или если типы передаваемого значения и приемника не совместимы для присваивания. Для корректной работы необходимо, чтобы передаваемое значение было того же типа, что и приемник, либо могло быть преобразовано к нему.

Синтаксис

gofunc (v Value) Set(x Value)

Пример

Давайте изменим значение переменной типа string с помощью отражения:

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

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

go"12345"

Пример

Теперь изменим значение целочисленной переменной:

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

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

go42

Пример

Попытка установить значение для неадресуемой переменной вызовет панику. Давайте посмотрим на это на примере:

gopackage 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")
  }
}

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

go"value is not settable"

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

  • метод reflect.Value.CanSet,
    который проверяет, можно ли изменить значение
  • метод reflect.Value.SetInt,
    который устанавливает целочисленное значение
  • метод reflect.Value.SetString,
    который устанавливает строковое значение
  • функцию reflect.ValueOf,
    которая создает значение reflect.Value из интерфейса