反射中调用Set()会panic的根本原因是值不可设置,必须通过传入指针并调用Elem()解引用,确保CanSet()为true才能安全赋值。

在Golang中,对反射获取的值调用
Set()
Set
通过
reflect.ValueOf(v)
Value
CanAddr()
Value
CanSet()
Value
CanAddr
只有当
CanSet()
true
Set()
SetInt()
以下几种情况会导致
CanSet()
false
Set()
立即学习“go语言免费学习笔记(深入)”;
reflect.ValueOf(x)
要避免panic,必须确保反射操作的对象是可设置的。通常做法是:
reflect.ValueOf(&x)
Elem()
CanSet()
Set()
var num int = 10
v := reflect.ValueOf(&num) // 传指针
if v.Kind() == reflect.Ptr {
v = v.Elem() // 解引用到实际值
}
if v.CanSet() {
v.SetInt(20) // 此时不会panic
}
// num 现在是 20
如果跳过
Elem()
Value
SetInt()
设置结构体字段时,除了传指针和
Elem()
type Person struct {
Name string // 可设置
age int // 不可设置,非导出字段
}
p := &Person{Name: "Alice"}
v := reflect.ValueOf(p).Elem()
nameField := v.FieldByName("Name")
if nameField.CanSet() {
nameField.SetString("Bob") // 成功
}
ageField := v.FieldByName("age")
// ageField.CanSet() == false,调用Set会panic
基本上就这些。只要记住:反射赋值前必须确保
CanSet()
Set()
以上就是为什么在Golang中对反射获取的值调用Set()方法会引发panic的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号