【发布时间】:2018-03-06 12:37:16
【问题描述】:
我目前遇到以下问题:
我通过 websocket 得到一个 []byte / 字符串,看起来像
eventname {"JSON": "data", "In": "different formats"}
我通过 eventname 和 JSON 数据之间的空格分割字符串,根据 eventname,我想将 JSON 数据 json.Unmarshal() 转换为特定类型或 var特定类型,以确保其所有类型都是安全的。
所以我可能会有一个地图,其中包含所有可能的事件名称和 JSON 数据的相应类型,但我不确定如何保存类型,可能是通过引用还是通过字符串化名称?
type EventTypeList map[string]*interface{}
或
type EventTypeList map[string]string
所以我可以查找事件是否在 EventTypeList 中,然后让 Unmarshal func 将数据解析为映射中的类型。
所以基本上不是具体类型“SpecificData”:
type SpecificData struct {
JSON string
In string
}
socketData := SpecificData{}
err := json.Unmarshal(jsonData, &socketData)
我想通过 EventTypeList 中的类型动态创建 socketData var
socketData := [dynamically determine this Type from EventTypeList]{}
在我将数据解析为该类型后,我想调用该事件的所有侦听器并为它们提供正确类型的 socketData,以便它们可以处理预期的数据。
但我真的不确定我将如何做到这一点,如果这是可能的,或者这是否是正确的方法......
感谢您的帮助!
【问题讨论】:
-
而不是在地图中保存类型,为什么你没有功能。喜欢
map[string]func(b []byte) (interface{}, error) -
@vedhavyas 但是我将如何告诉 Unmarshal 函数将 json 数据解组为哪种类型?我不希望将正常的
map[string]interface{}数据传递给回调函数,然后需要测试回调本身中的每个键和每个类型。 -
啊,好吧。让我想想然后回来
-
我能想到的一种方法是让所有类型都实现一个接口类型,而您的函数可以返回该接口。