【问题标题】:In Golang, can I customise key comparison, if I am taking struct as key?在 Golang 中,如果我将结构作为键,我可以自定义键比较吗?
【发布时间】:2016-05-25 13:05:54
【问题描述】:

Golang 中的 map 如何比较键?出于某种原因,我需要一个结构作为键,其中有 2 个值。我希望地图仅按第一个值进行比较,而不是第二个。二是供我使用。就像在 java 中一样,我可以自定义 equals 方法,所以 map 只需要 logically equal 里面的键。有什么办法吗?

编辑:看起来没有办法做到这一点。所以我现在把我的问题放在这里。请帮助我以“Go-way”的方式思考。

所以,我想实现一个“定时映射”,它跟踪键插入时间。换句话说,有一个地图可以接受和处理这些值。现在,如果地图中的数据早于某个特定的时间间隔,那么我应该将其清除。

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

为了处理,我将循环映射并检查是否有任何特定键在内部超过阈值限制,然后我将其清除。我可以在值数组中有这个时间戳,但它也有自己的时间戳,所以再放一个可能会混淆其他人。

请提出一些建议。

【问题讨论】:

  • 不,您无法更改地图的散列方式。
  • 哦,那是个坏消息。我需要找到一些替代方案。 Golang 非常“有限”。 :-(
  • @theGamblerRises 不受限制。你想让我做什么?不要在 golang 中实现 java 代码。
  • 看起来只有 ID 是一个键,时间戳是一个值,应该作为值存储。我看不出有什么理由必须将它们都放入一个结构并将其用作映射键
  • 你也可以使用优先队列:stackoverflow.com/q/6644688/124319

标签: dictionary go hashtable


【解决方案1】:

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

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 秒解锁并从地图中删除项目。如果您这样做,您还需要使用互斥锁,这样调用范围就不会访问映射,而运行后台的删除函数正在过滤掉旧项目。

覆盖位真的很简单,只需测试项目是否在地图中,检查它的时间戳,如果超过阈值则分配新值,如果没有则什么都不做。

这里要带走的主要事情是不要使用结构作为您的密钥...没有理由进行对象相等,您的对象有一个 id,我们将它作为您的密钥。您关心的所有其他内容都可以保留在值上(甚至键本身也是如此)。正如有人指出的那样,这不是 Java,即使它是,C# 和 Java 中的相等覆盖简直就是一场他妈的噩梦。

【讨论】:

  • 谢谢。我现在要在值中使用时间戳。我将更新我的解决方案。除此之外,Java 中的相等覆盖对我来说非常方便。我喜欢 golang,因为它简单且处理速度更快。但是Java对我来说太美了,**个人观点**。
  • @theGamblerRises 是的,不喜欢覆盖只是一个见仁见智的问题。它们可以使代码看起来不错,但我认为它们会使大型项目中的维护变得更加困难,并且如果您以后发现需要进行参考比较,这会使您陷入困境。
猜你喜欢
  • 1970-01-01
  • 2011-04-25
  • 2019-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多