草庐IT

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

coder 2024-07-10 原文

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/

有关dictionary - 在 Golang 中,如果我将 struct 作为键,我可以自定义键比较吗?的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类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

  2. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  3. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

    我希望我的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

  4. ruby - 我可以使用 Ruby 从 CSV 中删除列吗? - 2

    查看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

  5. ruby - RSpec - 使用测试替身作为 block 参数 - 2

    我有一些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

  6. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  7. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

  8. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  9. ruby - 如果指定键的值在数组中相同,如何合并哈希 - 2

    我有一个这样的哈希数组:[{: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

  10. ruby - 有人可以帮助解释类创建的 post_initialize 回调吗 (Sandi Metz) - 2

    我正在阅读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方法

随机推荐