根据 Golang 中 hashmap 的值获取键的简单方法
Simple way of getting key depending on value from hashmap in Golang
给定一个 Golang 中的 hashmap,它有一个键和一个值,在给定值的情况下检索键的最简单方法是什么?
例如 Ruby 相当于
key = hashMap.key(value)
没有内置函数可以执行此操作;你必须自己做。下面是适用于 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")
}
重要的问题是:您需要查找该值多少次?
如果您只需要执行一次,那么您可以遍历键值对并保留与值匹配的键(或多个键)。
如果您必须经常进行查找,那么我建议您制作另一个具有键值反转的映射(假设所有键都映射到唯一值),并使用它来进行查找。
我正在基于比特币的服务器上工作,并且有一个支付脚本的常量和字节码列表。在 C++ 版本中,它有两个标识符和代码,然后是 returns 字符串版本的另一个函数。所以只需要原始的,操作码作为字符串键,字节作为值,然后颠倒顺序,真的没有太多额外的工作。唯一让我烦恼的是值上的重复键。但是因为那些只是真和假,重叠零和一,字符串切片的所有第一个索引都是数字和操作码,真值是第二个索引。
每次迭代列表以识别要执行的脚本命令将平均花费 50% 的被测试地图元素。只进行反向查找table就简单多了。执行脚本必须在一个完整的块上执行多达 10,000 次,因此节省内存并支付处理费用是没有意义的。
给定一个 Golang 中的 hashmap,它有一个键和一个值,在给定值的情况下检索键的最简单方法是什么?
例如 Ruby 相当于
key = hashMap.key(value)
没有内置函数可以执行此操作;你必须自己做。下面是适用于 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")
}
重要的问题是:您需要查找该值多少次?
如果您只需要执行一次,那么您可以遍历键值对并保留与值匹配的键(或多个键)。
如果您必须经常进行查找,那么我建议您制作另一个具有键值反转的映射(假设所有键都映射到唯一值),并使用它来进行查找。
我正在基于比特币的服务器上工作,并且有一个支付脚本的常量和字节码列表。在 C++ 版本中,它有两个标识符和代码,然后是 returns 字符串版本的另一个函数。所以只需要原始的,操作码作为字符串键,字节作为值,然后颠倒顺序,真的没有太多额外的工作。唯一让我烦恼的是值上的重复键。但是因为那些只是真和假,重叠零和一,字符串切片的所有第一个索引都是数字和操作码,真值是第二个索引。
每次迭代列表以识别要执行的脚本命令将平均花费 50% 的被测试地图元素。只进行反向查找table就简单多了。执行脚本必须在一个完整的块上执行多达 10,000 次,因此节省内存并支付处理费用是没有意义的。