Метод reflect.Value.CanSet
Метод CanSet проверяет, можно ли изменить значение, хранящееся в отражаемом значении reflect.Value. Он возвращает true, если значение является адресуемым и может быть изменено через соответствующие методы Set, SetInt, SetString и другие. В противном случае возвращается false.
Значение считается изменяемым, если оно получено из адресуемой переменной (например, через reflect.ValueOf(&x).Elem) и не является неэкспортируемым полем структуры. Для неадресуемых значений или констант метод вернет false.
Синтаксис
v.CanSet() bool
Пример 1
Давайте проверим возможность изменения для адресуемого значения:
package main
import (
"fmt"
"reflect"
)
func main() {
x := 10
v := reflect.ValueOf(&x).Elem()
fmt.Println(v.CanSet())
}
Результат выполнения кода:
true
Пример 2
Давайте проверим возможность изменения для неадресуемого значения:
package main
import (
"fmt"
"reflect"
)
func main() {
x := 10
v := reflect.ValueOf(x)
fmt.Println(v.CanSet())
}
Результат выполнения кода:
false
Пример 3
Давайте проверим возможность изменения для элемента слайса:
package main
import (
"fmt"
"reflect"
)
func main() {
s := []int{1, 2, 3}
v := reflect.ValueOf(&s).Elem().Index(0)
fmt.Println(v.CanSet())
}
Результат выполнения кода:
true
Пример 4
Давайте попробуем изменить значение, только если это возможно:
package main
import (
"fmt"
"reflect"
)
func main() {
x := 10
v := reflect.ValueOf(&x).Elem()
if v.CanSet() {
v.SetInt(20)
}
fmt.Println(x)
}
Результат выполнения кода:
20
Смотрите также
-
метод
reflect.Value.Set,
который изменяет значение на новое -
метод
reflect.Value.SetInt,
который изменяет целочисленное значение -
метод
reflect.Value.SetString,
который изменяет строковое значение -
метод
reflect.Value.Elem,
который возвращает значение, на которое указывает указатель