Go 我们可以通过反射更新结构字段上的标记吗?

Go 我们可以通过反射更新结构字段上的标记吗?,go,struct,Go,Struct,我想知道,在将数据解包到结构实例之前,是否可以更新结构实例上的标记 类型响应结构{ Name字符串`json:Name` Payload json.RawMessage`json:默认值` } var数据响应 json.Unmarshalserver_响应和数据 其动机是在响应结构中加载公共键,并通过传递原始负载将特定于API的响应委托给API处理程序 有效负载字段是复杂的结构,因此在它们自己的处理程序中进行解析会使它更干净 需要应用标记,让json.Unmarshal知道从服务器响应映射到有效

我想知道,在将数据解包到结构实例之前,是否可以更新结构实例上的标记

类型响应结构{ Name字符串`json:Name` Payload json.RawMessage`json:默认值` } var数据响应 json.Unmarshalserver_响应和数据 其动机是在响应结构中加载公共键,并通过传递原始负载将特定于API的响应委托给API处理程序

有效负载字段是复杂的结构,因此在它们自己的处理程序中进行解析会使它更干净

需要应用标记,让json.Unmarshal知道从服务器响应映射到有效负载的密钥

像Name这样的元数据字段需要一些验证。因此,如果我将整个响应传递给处理程序,每个处理程序都必须提取每个字段并返回此元数据,这不是一种非常干净的方法

解码对map[string]接口{}的响应也会导致相同的问题。我希望元数据的所有字段都在一个结构中,自动填充,并由处理程序解析有效负载。解码到通用映射,意味着复制密钥

例如:

类型响应结构{ 版本int 名称字符串 散列字符串 有效负载json.RawMessage } 希望主函数在这个对象中加载服务器响应,能够执行各种验证,并将负载传递给处理程序,让它处理它

使用通用映射意味着编写如下代码: decodedData.Version=genericMap[Version]
它不能扩展到很多键。

如果我正确理解了您的问题,为什么不将整个响应传递给处理程序?然后,处理程序将知道它是否需要从stats或id或任何字段中读取。。。大致显示了这个想法


另一种方法是将响应解码为map[string]接口{},然后使用它将部分响应解码为结构

我认为这是不可能的。你为什么要做这样的事?如果你一开始就知道你想要json中的id,为什么不把它设为id呢?@edkevek我正在探索一种不同的方法。服务器响应将包含元数据字段和一个有效负载字段,我只想将其传递给API响应处理程序以解组它。但是要在数据中加载对象,我需要应用标记。为什么需要应用标记来加载数据?这在Messtruct看来并不清楚,标记是该类型的一个特性,并且类型在运行时是不可变的。您可以使用反射创建一个新类型,但它比映射更难使用。更新了说明,说明了我不想使用泛型映射的原因。我理解您关于泛型映射的观点,这正是mapstructure包发挥作用的地方:它允许您将映射[字符串]接口{}解组到结构中,不再需要像decodedData.Version=genericMap[Version]那样编写代码。