通过反射访问的结构体的存储字段



我正在为我的游戏从CSV中挑选任务参数。参数包括跟踪的状态,例如"cardsdeployed",以及对该任务有效的卡片类型的条件。条件可能像"Cost:4"其中Cost对应于程序内部结构体中的字段:

type template struct {
Cost int
// other parameters
}

我有玩家属性,将卡片模板映射到所需的属性,例如

playerStats["CardsDeployed"] = map[template]uint{}

给定一个任务条件,我如何为满足该条件的所有模板过滤此映射?我知道我可以通过映射地图中每个模板的具体值来做到这一点,并使用字段名称访问所需的字段("成本"),但这似乎非常昂贵(这是在游戏服务器上,所以必须经常为许多玩家做)。我不能将模板转换为泛型map[string]接口{},因为它在我的代码中使用,所以我需要它是强类型的。

TLDR:是否有一种方法可以存储对结构类型(这里是模板)字段的引用,然后可以用来从该结构的任何具体实例访问该特定字段?当我的程序运行时,我已经知道结构布局和所有任务,所以在这种情况下,我只需要运行反射一次并存储字段引用。 如果进一步的细节对我有帮助,请告诉我。谢谢!

既然你提到我的评论是你想要的解决方案。这个问题。我想这应该是一个答案。所以:

在字段名只能作为字符串使用的情况下,您最好给模板一个方法GetValue(name string)或其他东西,并在template结构体中使用map[string]interface{}来保存所有值。如果一端有一个大的动态字段名列表,那么使用静态字段名的结构体可能不是存储数据的最佳方式。

type template struct {
data map[string]interface{}
}
func (t *template) GetValue(name string) interface{} {
if v, ok := t.data[name]; ok {
return v
}
return nil
}

最新更新