go - 如何使用反射设置另一个结构的字段之一的结构字段值?
问题描述
我正在编写一个可以帮助我设置对象的任何字段值的工具,但是有一个问题。
我有两个结构播放器和卡片:
type Player struct {
Name string
IDCard Card
}
type Card struct {
ID string
}
有功能
func setVal(data interface{}, fieldPath []string, val string) {
// ...
}
该函数应该做的是将数据的特定字段值设置为val。例如
p := Player{
Name: "Tsuru",
IDCard: Card{ID: "id"},
}
fieldPath_Name := []string{"Name"}
fieldPath_ID := []string{"IDCard", "ID"}
setVal(&p, fieldPath_Name, "Miku") // set p.Name to "Miku"
setVal(&p, fieldPath_ID, "newID") // set p.IDCard.ID to "newID"
表示将IDCard中的字段Name设置为“Miku”,将ID设置为“newID”,即对象p的字段。
我的方法是根据fieldPath使用 golang reflect 递归获取每个字段的值和类型。
现在name设置可以成功了,但是如何完成ID设置呢?IDCard 是一个结构体,是 Player 的字段之一。
谢谢!
解决方案
rv := reflect.ValueOf(&p).Elem()
rv.FieldByName("IDCard").FieldByName("ID").SetString("newID")
推荐阅读
- dataset - 我试图上传我的 csv 文件数据集,但 weka 无法识别它
- sql - 减少数量直到我用完所有数量
- c++ - 在运行时 C++ 设置类字段大小
- multithreading - Recursive impl Extend for HashMap<_, HashSet<_>> 在哪里组合集合,而不是覆盖?
- jquery - jQuery:使用输入的值作为匹配数组的名称
- google-sheets - 谷歌工作表 - 取消数据透视表并跳过空白单元格
- javascript - 如何在AngularJs中使函数参数可选?
- ssl - 匿名 TLS 中的凭据
- ansible - 当 Ansible 中的所有主机的gather_facts 设置为“no”时,如何在 Ansible 中收集 localhost 事实?
- google-api - 如何减少用于查询频道所有视频的 viewCount 的配额?