Метод reflect.Value.SetString

Метод reflect.Value.SetString устанавливает новое строковое значение для переменной, представленной объектом reflect.Value. Метод принимает один параметр - строку, которая будет установлена. Важно понимать, что метод работает только с изменяемыми значениями (полями структур, элементами слайсов, переменными, переданными по ссылке). При попытке установить значение для неизменяемого объекта возникает паника.

Синтаксис

govalue.SetString(s string)

Пример

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

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  var str string = "old value"
  val := reflect.ValueOf(&str).Elem()
  
  if val.CanSet() {
    val.SetString("new value")
  }
  
  fmt.Println(str)
}

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

go"new value"

Пример

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

gopackage main

import (
  "fmt"
  "reflect"
)

type Person struct {
  Name string
  Age  int
}

func main() {
  p := Person{Name: "Alice", Age: 25}
  val := reflect.ValueOf(&p).Elem()
  nameField := val.FieldByName("Name")
  
  if nameField.CanSet() {
    nameField.SetString("Bob")
  }
  
  fmt.Println(p.Name)
}

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

go"Bob"

Пример

Попытка установить значение для неизменяемого объекта приводит к панике. Всегда проверяйте доступность изменения через метод CanSet:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  var str string = "hello"
  val := reflect.ValueOf(str)
  
  fmt.Println("Can set:", val.CanSet())
  
  // Если раскомментировать следующую строку, возникнет паника
  // val.SetString("world")
}

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

go"Can set: false"

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

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