我有两种无法更改的基于3rdparties代码的结构类型

1
2
3
4
5
type AddEvent struct {
}

type DeleteEvent struct {
}

我想创建一个字符串映射作为键和对象作为值
因此,每当我收到新事件时,我都会将其添加到地图中
地图应如下所示:

1
2
3
4
EventMap:
    event1,AddEvent{}
    event2,AddEvent{}
    event2,DeleteEvent{}

AddEvent和DeleteEvent未定义为接口的问题。
我是否可以使用任何结构作为值在go中创建通用映射,如果是的话,我该如何读取它,我需要使用reflect检查类型

1
2
3
4
5
I.E
event:=EventMap[event1]
if reflect.TypeOf(event)==AddEvent{
}else if reflect.TypeOf(event)==DeleteEvent{
}
  • 您可以使用map[string]interface{},即空接口的映射,并且可以使用类型断言来读取它。 例如。 ae, ok := m["add_event"].(AddEvent)

评论说的内容看起来不错,但缺少type switch。 完整版也许您需要的是:

1
2
3
4
5
6
7
8
9
m := make(map[string]interface{})
addEvent := new(AddEvent)
m["event1"] = addEvent
switch m["event1"].(type) {
case *AddEvent:
    // do something
case *DeleteEvent:
    // do other things
}
  • 感谢工作:),但不应使用指针大小写* AddEvent:由大小写AddEvent代替:
  • 最好使用指针引用,除非需要获取struct的副本。
  • 同意,因为我也可以更改结构