【发布时间】:2026-02-17 03:35:02
【问题描述】:
我有一张这样的地图
type Store map[string]string
从这张地图,我想填充一个结构。目标是,对于结构体的每个字段,找到与字段名匹配的键,取值,根据结构体字段的类型,将值转换为合适的结构体字段类型并设置。
基本上,地图将包含整数、布尔值、字符串和持续时间作为字符串,因此转换应该只是strconv.atoi()、time.parseDuration() ...
另外,我想使用 structs 标签来指定 map 中键的名称,因为 struct 字段可能是 camelCase,而 map 中的键将是这样的“example_key”
知道如何做到这一点。我已经阅读了有关 golang 反射的信息,但它对我来说仍然是不透明的。我只需要一个解释来解决这个问题,然后我想我可以自己处理实现。
谢谢
【问题讨论】:
-
这应该是一种适用于一般情况的方法吗?如果没有,约定是在包中定义一个构造函数,在那里进行赋值并返回一个新实例。就像
func NewStoreObject(store map[string]string) StoreObject, error。如果你正在寻找一个通用的解决方案,你会问很多。但我想我也可以给出一个解释。它只是反映结构上的类型,根据字段名称索引映射,打开结构字段类型,在每种情况下您都有代码来进行转换和赋值。 -
@evanmcdonnal 你好!这不是针对一般用例,而是针对特定用例。我现在将确切地在结构中使用哪些类型,所以只会对这些类型进行转换,但我仍然需要测试 reflect.Type 我猜。该地图不会作为参数传递,它来自其他地方,但您建议的原型是我的想法。
-
嗯,这两种范式都不适合。如果您使用反射,我希望您使用它来决定在运行时在哪些字段上设置哪些值。如果您编写的代码在编译时显示为
thisType.Name = storeMap["name"],那么您不妨使用我描述的构造函数类型范例,因为您将对每种类型都有一个特殊情况,就像它们都有自己的构造函数方法一样映射并返回实例。如果你想要像ConvertoObject(store Store) interface{}这样的单一方法,那么使用反射是合理的。 -
@evanmcdonnal 我明白你的意思。我认为这比编写一个大的构造函数块要“干净”得多。您能否继续使用一般方法扩展反射解决方案,以便我了解这一点?
标签: reflection go