go - 如何使用 Golang 中的反射将 time.Time 类型的字段的值设置为 time.Now()
问题描述
我有一个类型的结构
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))
,我在这里遇到错误。
解决方案
您必须导出结构字段,否则只有声明包可以访问它们。
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}
推荐阅读
- r - 平滑 cdf 估计中的网格规范(“kerdiest”包)
- r - 如何在闪亮的应用程序中创建一个接收由逗号分隔的多个单词的文本输入?
- javascript - 使用 IBM Gateway 脚本返回字符串的选定部分
- python - 查找数组中创建所需结果的所有组合
- java - AWS KMS,使用适用于 Java 的开发工具包创建 CMK
- amazon-web-services - 引号中嵌入换行符的 Redshift 副本
- windows - rltGetVersion 不正确的想法为什么?
- bash - gsutil 仅收集文件名
- ios - 如何在 UIActionSheet 中的文本旁边插入图像?
- c# - 我是否需要为每个客户提供一个机器人,或者我可以拥有一个为所有客户服务的机器人?