我有一个类型的结构
type test struct {
fname string
time time.Time
}
我想仅使用反射包将“时间”字段的值设置为 time.Now()。
我正在创建一个类似这样的函数:
func setRequestParam(arg interface{}, param string, value interface{}) {
v := reflect.ValueOf(arg).Elem()
f := v.FieldByName(param)
if f.IsValid() {
if f.CanSet() {
if f.Kind() == reflect.String {
f.SetString(value.(string))
return
} else if f.Kind() == reflect.Struct {
f.Set(reflect.ValueOf(value))
}
}
}
}
我要解决的是这个表达式 f.Set(reflect.ValueOf(value))
,我在这里遇到错误。
答案 0 :(得分:1)
您必须导出结构字段,否则只有声明包可以访问它们。
type test struct {
Fname string
Time time.Time
}
通过此更改,您的 setRequestParam()
函数可以工作了。
测试:
t := test{}
setRequestParam(&t, "Fname", "foo")
setRequestParam(&t, "Time", time.Now())
fmt.Printf("%+v\n", t)
输出(在 Go Playground 上尝试):
{Fname:foo Time:2009-11-10 23:00:00 +0000 UTC m=+0.000000001}