使用reflect,如何设置结构字段的值?
|
在使用ѭ0with包处理结构字段时遇到了麻烦。特别是,还没有弄清楚如何设置字段值。
输入t struct {fi int; fs字符串}
var r t = t {123,\“ jblow \”}
var i64 int64 = 456
获取字段i的名称-这似乎起作用
var field = reflect.TypeOf(r).Field(i).Name
作为a)接口{},b)int获取字段i的值-这似乎有效
var iface interface{} = reflect.ValueOf(r).Field(i).Interface()
var i int = int(reflect.ValueOf(r).Field(i).Int())
设置字段i的值-尝试一次-紧急
reflect.ValueOf(r).Field(i).SetInt( i64 )
恐慌:使用通过未导出字段获得的值,reflect.Value·SetInt
假设它不喜欢字段名称\“ id \”和\“名称\”,因此重命名为\“ Id \”和\“名称\”
a)这个假设正确吗?
b)如果正确,则认为没有必要,因为在同一文件/包中
设置字段i的值-尝试两个(字段名大写)-紧急
reflect.ValueOf(r).Field(i).SetInt( 465 )
reflect.ValueOf(r).Field(i).SetInt( i64 )
恐慌:使用不可寻址的值反射。值·SetInt
@peterSO的以下说明全面,高质量
四。这有效:
reflect.ValueOf(&r).Elem().Field(i).SetInt( i64 )
他还证明字段名称必须是可导出的(以大写字母开头)
没有找到相关结果
已邀请:
2 个回复
悲帽慑彤电
字段的值,同时小心避免错误。 Go
软件包具有
功能。
如果值的CanAddr返回true 地址可以通过Addr获取。 这样的值称为可寻址的。一种 如果值是可寻址的 切片的元素, 可寻址数组,一个 可寻址结构,或 取消引用指针。如果CanAddr 返回false,调用Addr将 恐慌。 Go
软件包具有
函数,如果为
,则意味着
也是
。
如果v的值,则CanSet返回true 可以更改。值可以更改 仅当它是可寻址的并且不是 通过使用未出口获得 结构字段。如果CanSet返回 假,调用Set或任何 特定类型的设置器(例如SetBool, SetInt64)会惊慌。 我们需要确保可以在字段“ѭ8”中
。例如,
如果可以确定所有错误检查都是不必要的,则该示例可以简化为:
凄挡
印刷品: