gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:27:10 26 4
gpt4 key购买 nike

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

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

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

所以,我想到了一个包含 id 和时间戳的关键结构。当一个新键到来时,map 将其与 id 和 currentTimeInMillis 一起获取。一段时间后,如果出现一个已经存在的键,则 map 应该保留第一次插入时间并且只更新值数组。

为了处理,我将在 map 上循环并检查是否有任何特定键在内部超过阈值限制,然后我将其清除。我可以在值数组中包含此时间戳,但它也有自己的时间戳,因此再放一个可能会使其他人感到困惑。

请提出一些建议。

最佳答案

把时间放在你的值(value)上。以下是有关如何构建数据的一些示例。

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

覆盖位非常简单,只需测试该项目是否在 map 中,检查它的时间戳,如果超出阈值则分配新值,否则什么都不做。

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

关于dictionary - 在 Golang 中,如果我将 struct 作为键,我可以自定义键比较吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37438108/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com