使用reflect
包处理结构体字段时遇到了一些问题,尤其是没有弄清如何设置字段值。
type t struct { fi int; fs string } var r t = t{ 123, "jblow" } var i64 int64 = 456
获取第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 )
panic: reflect.Value·SetInt使用使用未公开字段获得的值
假设它不喜欢字段名称"id"和"name",因此重命名为"Id"和"Name"
a)这个假设正确吗?
b)如果正确,是否认为不需要重命名,因为在同一个文件/包中
设置第i个字段的值 - 尝试二(使用大写字段名称) - 引发恐慌
reflect.ValueOf(r).Field(i).SetInt( 465 )
reflect.ValueOf(r).Field(i).SetInt( i64 )
panic: reflect.Value·SetInt使用不可寻址的值
@peterSO提供了详细和高质量的以下说明:
四. 这个可以工作:
reflect.ValueOf(&r).Elem().Field(i).SetInt( i64 )
他还记录了字段名称必须是可导出的(以大写字母开头)。
reflect
设置数据的例子是http://comments.gmane.org/gmane.comp.lang.go.general/35045,但即使在那里,他也使用了`json.Unmarshal`来完成实际的工作。 - cc young