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

时间:2016-05-25 13:05:54

标签: dictionary go hashtable

Golang中的地图如何比较密钥?出于某种原因,我需要一个结构作为键,其中包含2个值。我希望地图只比较第一个值,而不是第二个。第二是我的用法。就像在java中一样,我可以自定义equals方法,因此map中只会包含logically equal个键。有没有办法做到这一点?

编辑:看起来没有办法做到这一点。所以我现在在这里解决我的问题。请帮我思考一下Go-way'。

所以,我想实现一个定时地图',它跟踪密钥插入时间。换句话说,有一个接受和处理值的地图。现在,如果地图中的数据早于某个特定的时间间隔,那么我应该清除它。

所以,我想到了一个具有id和timestamp的键结构。当一个新密钥出现时,map将使用id和currentTimeInMillis。一段时间后,如果一个密钥已经存在,那么map应保留第一个插入时间并仅更新值数组。

要进行处理,我将在地图上循环并检查是否有任何特定的密钥在内部超过阈值限制,然后我清除它。我可以在value数组中有这个时间戳,但是它也有自己的时间戳,所以再放一个可能会让别人感到困惑。

请提出建议。

1 个答案:

答案 0 :(得分:0)

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

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中的平等覆盖确实是一个他妈的噩梦。