我有一个使用接口作为键的地图。地图是这样定义的MyMap map[Signature]Packets
。接口是Signature
,并且将有两个结构A
和B
实现这个接口。我也msgp
用来序列化这两个结构。
我的问题是msgp
自动生成使用指针作为函数接收器类型的方法,我认为这会使键Signature
接收指针。如果是这种情况,那么键每次都会不同,因为指针不同,即使基础值相同。因此,每次,我都会创建一个新条目,而不是找到现有条目并对其进行修改。
我想知道:
- 有没有办法强制
msgp
使用具体类型的函数接收器来生成方法?目前,我只能将自动生成的方法的函数接收器修改为MarshalMsg
具体UnmarshalMsg
类型(A
或B
代替*A
或*B
)。通过这样做,地图的键是 typeA
或 typeB
,并且地图MyMap
工作正常。但是,我知道我不应该修改自动生成的代码。所以,我想知道是否有一种可接受的方式来做到这一点。 - 如果没有办法做 1.,是否有任何解决方法来解决这个问题?我真的需要地图键的一些多态特性,使用
msgp
.
更新 1(4 月 12 日):感谢您分享您的想法并提供解决方案。以下是关于我的问题的一些细节。
- 背景是地图用于收集不同的网络事件。实现接口的两个结构
Signature
是EventSignatureIPv4
和EventSignatureIPv6
type EventSignatureIPv4 struct {
SourceIPv4 [4]byte
Port uint16
Traffic TrafficType
}
type EventSignatureIPv6 struct {
SourceIPv6 [16]byte
Port uint16
Traffic TrafficType
}
并且Signature
持有在 IPv4 和 IPv6 数据之间共享的通用方法。因此,本质上,我想在运行时收集和分组相应的 IPv4/v6 事件。地图的关键是识别同一个源,地图的价值是收集不同目的地的事件。
msgp
我正在使用的库是这个https://pkg.go.dev/github.com/tinylib/msgp@v1.1.5/msgp如果我错了,请纠正我。对于 Go 中的组合,如果方法集中的方法之一具有指针类型的函数接收器,那么实例只会是指针类型吗?所以在这里,就像我一样
func (z *EventSignatureIPv6) MarshalMsg(b []byte) (o []byte, err error) {
/* Auto-generated code */
}
每当我Signature
用来接收结构EventSignatureIPv6
时,结构只会是类型*EventSignatureIPv6
?