假设我在 Go 库中定义了以下接口:
type Task interface {
Do() error
}
func Register(task Task) { ... }
func GetId(task Task) int64 { ... }
在Register()
中,库将唯一性int64
与每个任务实例相关联。GetId()
必须返回给定任务的标识符。
我最初的想法是将关联存储为map[Task]int64
. 这似乎工作正常,但有人告诉我,如果实现的对象Task
不是平等可比的(例如,struct
包含 a 的 a map
),它会中断。我仍然需要检查这是否属实。
我打算尝试使用一片 ofstruct { task Task; id int64 }
代替并对其进行迭代,但这仍然需要相等的可比较Task
实例。而 AFAIU 在 Go 中没有身份比较。
我怎样才能拥有从Task
实例到它们的 ID 的强大映射?
编辑:到目前为止提出的两种解决方案都有效,但它们的缺点是每个任务实现都必须包含一些重复的代码来处理 ID。我可以在可以嵌入的 TaskBase 中提供该代码struct
,但理想情况下,我更喜欢不需要实现甚至知道 ID 的解决方案(它们在库内部,在库之外没有任何意义)。