Метод reflect.Value.CanSet

Метод CanSet проверяет, можно ли изменить значение, хранящееся в отражаемом значении reflect.Value. Он возвращает true, если значение является адресуемым и может быть изменено через соответствующие методы Set, SetInt, SetString и другие. В противном случае возвращается false.

Значение считается изменяемым, если оно получено из адресуемой переменной (например, через reflect.ValueOf(&x).Elem) и не является неэкспортируемым полем структуры. Для неадресуемых значений или констант метод вернет false.

Синтаксис

gov.CanSet() bool

Пример 1

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

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  x := 10
  v := reflect.ValueOf(&x).Elem()
  fmt.Println(v.CanSet())
}

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

gotrue

Пример 2

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

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  x := 10
  v := reflect.ValueOf(x)
  fmt.Println(v.CanSet())
}

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

gofalse

Пример 3

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

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  s := []int{1, 2, 3}
  v := reflect.ValueOf(&s).Elem().Index(0)
  fmt.Println(v.CanSet())
}

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

gotrue

Пример 4

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

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  x := 10
  v := reflect.ValueOf(&x).Elem()

  if v.CanSet() {
    v.SetInt(20)
  }

  fmt.Println(x)
}

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

go20

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

  • метод reflect.Value.Set,
    который изменяет значение на новое
  • метод reflect.Value.SetInt,
    который изменяет целочисленное значение
  • метод reflect.Value.SetString,
    который изменяет строковое значение
  • метод reflect.Value.Elem,
    который возвращает значение, на которое указывает указатель