Метод reflect.Value.SetInt
Метод reflect.Value.SetInt устанавливает новое целочисленное значение для переменной,
представленной объектом reflect.Value. В качестве аргумента метод принимает значение
типа int64, которое будет присвоено переменной. Важно понимать, что метод работает
только с переменными, которые являются адресуемыми и могут быть изменены. Если попытаться
вызвать SetInt на неадресуемом значении, будет вызвана паника.
Синтаксис
reflect.Value.SetInt(x int64)
Пример
Давайте установим новое значение для целочисленной переменной:
package main
import (
"fmt"
"reflect"
)
func main() {
num := 42
val := reflect.ValueOf(&num).Elem()
fmt.Printf("Before: %d\n", num)
val.SetInt(100)
fmt.Printf("After: %d\n", num)
}
Результат выполнения кода:
"Before: 42"
"After: 100"
Пример
Попробуем установить значение, выходящее за пределы допустимого диапазона для типа:
package main
import (
"fmt"
"reflect"
)
func main() {
var small int8 = 10
val := reflect.ValueOf(&small).Elem()
fmt.Printf("Before: %d\n", small)
val.SetInt(200)
fmt.Printf("After: %d\n", small)
}
Результат выполнения кода:
"Before: 10"
"After: -56"
Как видно из примера, значение 200 не помещается в тип int8, поэтому происходит переполнение,
и результатом становится -56 (200 - 256). Это важный момент, который нужно учитывать
при работе с SetInt.
Пример
Рассмотрим работу метода с указателем на структуру:
package main
import (
"fmt"
"reflect"
)
type Person struct {
Age int
}
func main() {
p := Person{Age: 25}
val := reflect.ValueOf(&p).Elem()
field := val.FieldByName("Age")
fmt.Printf("Before: %d\n", p.Age)
field.SetInt(30)
fmt.Printf("After: %d\n", p.Age)
}
Результат выполнения кода:
"Before: 25"
"After: 30"
Метод успешно изменяет поле структуры, так как поле Age является адресуемым.
Пример
Попробуем вызвать метод на неадресуемом значении:
package main
import (
"fmt"
"reflect"
)
func main() {
num := 42
val := reflect.ValueOf(num)
fmt.Printf("Can set: %v\n", val.CanSet())
val.SetInt(100)
}
Результат выполнения кода:
"Can set: false"
"panic: reflect: reflect.Value.SetInt using unaddressable value"
Как видно из примера, попытка вызвать SetInt на неадресуемом значении вызывает панику.
Поэтому перед вызовом метода рекомендуется использовать CanSet для проверки возможности
изменения значения.
Пример
Используем CanSet для безопасной проверки перед установкой значения:
package main
import (
"fmt"
"reflect"
)
func main() {
num := 42
val := reflect.ValueOf(&num).Elem()
if val.CanSet() {
val.SetInt(100)
fmt.Printf("Value set to: %d\n", num)
} else {
fmt.Println("Cannot set value")
}
}
Результат выполнения кода:
"Value set to: 100"
Смотрите также
-
метод
reflect.Value.Set,
который позволяет установить значение любого типа -
метод
reflect.Value.SetString,
который устанавливает строковое значение -
метод
reflect.Value.SetBool,
который устанавливает булево значение -
метод
reflect.Value.SetFloat,
который устанавливает значение с плавающей точкой