如何使用反射设置另一个结构的字段之一的结构字段值?

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

【讨论】:

我的方法不是那么有效,但现在我有了一些想法,感谢你的代码:)

以上是关于如何使用反射设置另一个结构的字段之一的结构字段值?的主要内容,如果未能解决你的问题,请参考以下文章

golang 使用reflect反射结构体

C# 反射 设置字段值无效的解决办法

如何使用 Go 反射 pkg 获取切片结构字段的类型?

go语言学习笔记 — 进阶 — 反射:反射的类型对象(reflect.Type)— 结构体标签(struct tag)是结构体字段的额外信息标签

082-反射(结构体字段遍历)

go语言 从结构体中获取某个字段的值(反射+泛型)