【问题标题】:go map key by reference, comparison by dereference通过引用去映射键,通过取消引用进行比较
【发布时间】:2014-11-04 15:04:30
【问题描述】:

我需要使用带有大字符串的大地图作为键。 go 的默认map 中有没有办法指定比较测试,以便将密钥视为地址?如果没有,是否有很好的库可以实现这一点?

请注意,我要防止的是,每当进行地图查找时,长字符串会不断通过副本传递。

【问题讨论】:

  • 字符串不是通过副本传递的,总是通过大小与字符串大小无关的“引用”传递。另请注意,字符串比较首先检查两个字符串是否具有相同的地址。
  • 一般情况下怎么样。假设我有一个要散列的自定义 BigFloat 类。
  • 过早优化...
  • 您无法指定测试或哈希函数,但如果您想要 (play.golang.org/p/4kYzKFoqZn) 并且如 dystroy 所说的字符串,您可以将地址本身用作键以及其他一些类型,例如接口值,是内部包含对大量数据的引用的小结构。
  • 由于所有这些 cmets 似乎或多或少地回答了原始问题,因此将摘要发布为社区 wiki 答案。

标签: go


【解决方案1】:

对于字符串的特殊情况,Go 默认执行您想要的操作:strings are currently represented by pointer/length pairs,因此您在复制字符串时不会复制字符串数据。

一般来说,您不能指定自定义比较(或哈希)函数。其他类型和自定义结构are treated according to rules listed in the spec:指针按地址比较,例如,固定大小的数组按值比较,切片类型通常不可比较,因此包含它们的结构类型不能用作映射键类型.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-19
    • 2018-05-25
    • 2011-10-09
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    • 2021-08-24
    • 2011-01-04
    相关资源
    最近更新 更多