【发布时间】:2011-06-18 09:24:05
【问题描述】:
在使用 reflect 包处理结构字段时遇到了困难。尤其是还没想好怎么设置字段值。
-
获取字段 i 的名称 - 这似乎有效
var field = reflect.TypeOf(r).Field(i).Name -
将字段 i 的值作为 a) interface{}, b) int - 这似乎可行
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来做实际的脏活 -
(以上评论已过时)
标签: go reflection go-reflect