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/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html
我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat
我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法