首页 > 解决方案 > 如何使用反射设置另一个结构的字段之一的结构字段值?

问题描述

我正在编写一个可以帮助我设置对象的任何字段值的工具,但是有一个问题。

我有两个结构播放器和卡片:

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 的字段之一。

谢谢

标签: goreflection

解决方案


rv := reflect.ValueOf(&p).Elem()
rv.FieldByName("IDCard").FieldByName("ID").SetString("newID")

https://play.golang.org/p/yab71JV_z0j


推荐阅读