在使用reflect
包处理结构字段时遇到了麻烦。特别是,还没有弄清楚如何设置字段值。
输入t struct {fi int; fs字符串} var rt = 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”和“ name”,因此将其重命名为“ Id”和“ Name”
a)这个假设正确吗?
b)如果正确,则认为没有必要,因为在同一文件/软件包中
设置字段i的值-尝试两个(字段名大写)-紧急
reflect.ValueOf(r).Field(i).SetInt( 465 )
reflect.ValueOf(r).Field(i).SetInt( i64 )
恐慌:使用不可寻址的值体现Reflect.Value·SetInt
@peterSO在下面的说明是详尽而高质量的
四。这有效:
reflect.ValueOf(&r).Elem().Field(i).SetInt( i64 )
他还证明字段名称必须是可导出的(以大写字母开头)
reflect
,以一组数据是comments.gmane.org/gmane.comp.lang.go.general/35045,但即使在那里,他用json.Unmarshal
做实际的肮脏的工作