在Golang中,如果我将结构作为键,我可以自定义键比较吗



Golang中的map如何比较键?出于某种原因,我需要有一个结构作为键,它里面有两个值。我希望地图只比较第一个值,而不是第二个值。第二个是我的习惯。像在java中一样,我可以自定义equals方法,所以map只接受其中的logically equal键。有办法做到这一点吗?

编辑:看来没有办法做到这一点。所以我现在把我的问题放在这里。请帮我在"Go way"中思考。

因此,我想实现一个"定时映射",它跟踪密钥插入时间。换句话说,存在一个接受和处理这些值的映射。现在,如果地图中的数据比某个特定的时间间隔旧,那么我应该清除它。

所以,我想到了一个具有id和时间戳的键结构。当一个新密钥到来时,map会将其与id和currentTimeInMillis一起使用。过了一段时间,如果一个已经存在的键出现,那么map应该保留第一次插入时间,并且只更新值数组。

为了进行处理,我将有一个循环映射,并检查是否有任何特定的密钥在里面超过阈值限制,然后我将其清除。我可以在值数组中有这个时间戳,但它也有自己的时间戳,所以多放一个可能会让其他人感到困惑。

请提出一些建议。

把时间放在你的价值上。以下是一些如何构建数据的示例。

type DataObj struct {
Id int
Updated time.Date
// other fields
}
m := map[int]DataObj{}
m[d.Id] = d // assign using the id as your key
for k, v := range m {
if time.Since(v.Updated) > duration {
delete(m, k) // remove the stale item
}
}
// some logic like this for adding/overwriting
v, ok := m[newObj.Id]
if ok { // an element with this id existed
if time.Since(v.Updated) > duration {
m[v.Id] = newObj // assign new value over old one
}
}

我不能提供任何更具体的东西,因为你没有任何代码可以使用。看起来你可能希望其中的一些(比如删除位)在计时器上运行。要做到这一点,请将该函数作为goroutine调用,并使用计时器,以便每隔X秒取消阻止并从映射中删除项目。如果要执行此操作,还需要使用互斥锁,以便调用作用域在后台运行的remove函数过滤掉旧项时不会访问映射。

覆盖位实际上是直接的,只需测试项目是否在地图中,检查其时间戳,如果超过阈值,则分配新值,否则什么都不做。

这里要去掉的主要内容是不要为键使用结构。。。没有理由进行对象平等,您的对象有一个id,我们将其作为您的密钥。你关心的其他一切都可以保持在值上(甚至密钥本身也是)。正如有人指出的那样,这不是Java,即使是Java,C#和Java中的平等重写也简直是一场噩梦。

最新更新