在Golang中给出一个具有键和值的哈希映射,在给定值的情况下检索键的最简单方法是什么?
例如Ruby等价物
key = hashMap[value]
答案 0 :(得分:8)
没有内置功能可以做到这一点;你必须自己做。下面是一个适用于map[string]int
的示例函数,您可以根据其他地图类型进行调整:
func mapkey(m map[string]int, value int) (key string, ok bool) {
for k, v := range m {
if v == value {
key = k
ok = true
return
}
}
return
}
用法:
key, ok := mapkey(hashMap, value)
if !ok {
panic("value does not exist in map")
}
答案 1 :(得分:6)
重要的问题是:你需要多少次查看价值?
如果您只需要执行一次,那么您可以迭代键值对,并保留与该值匹配的键(或键)。
如果你不得不经常查找,那么我建议你制作另一张有关键的地图,价值相反(假设所有的键都映射到唯一值),然后用它来查找。
答案 2 :(得分:0)
我正在处理基于比特币的服务器,并且有一个支付脚本的常量和字节代码列表。在C ++版本中,它既有代码标识符,又有另一个返回字符串版本的函数。因此,只需将原始数据作为字符串键,将字节作为值,然后反转顺序,就没有太多额外的工作。唯一让我烦恼的是重复键值。但由于这些只是真和假,重叠为零和一,所以字符串切片的第一个索引都是数字和操作码,而真值是第二个索引。
每次迭代列表以识别要执行的脚本命令将平均花费50%的测试地图元素。只有一个反向查找表要简单得多。执行脚本必须在完整的块上完成多达10,000次,因此在处理时节省内存和支付是没有意义的。