如何使用反射设置另一个结构的字段之一的结构字段值?
Posted
技术标签:
【中文标题】如何使用反射设置另一个结构的字段之一的结构字段值?【英文标题】:How to set struct field value in which is one of fields of another struct using reflect? 【发布时间】:2021-11-01 10:47:35 【问题描述】:我正在编写一个可以帮助我设置对象的任何字段值的工具,但是有一个问题。
我有两个结构 Player 和 Card:
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: CardID: "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"
表示在对象p的字段IDCard中设置Name字段为“Miku”,ID为“newID”。
我的方法是使用golang reflect 根据fieldPath递归获取每个字段的值和类型。
现在name设置可以成功,但是如何完成ID设置呢? IDCard 是一个结构体,是 Player 的字段之一。
谢谢!
【问题讨论】:
“我的方法是使用golang reflect 根据fieldPath递归获取每个字段的值和类型。” -- 那个方法在哪里?可以分享一下吗? 【参考方案1】:rv := reflect.ValueOf(&p).Elem()
rv.FieldByName("IDCard").FieldByName("ID").SetString("newID")
https://play.golang.org/p/yab71JV_z0j
【讨论】:
我的方法不是那么有效,但现在我有了一些想法,感谢你的代码:)以上是关于如何使用反射设置另一个结构的字段之一的结构字段值?的主要内容,如果未能解决你的问题,请参考以下文章
go语言学习笔记 — 进阶 — 反射:反射的类型对象(reflect.Type)— 结构体标签(struct tag)是结构体字段的额外信息标签