【问题标题】:How to use arbitrary length sequences of values as map keys in Go?如何在 Go 中使用任意长度的值序列作为映射键?
【发布时间】:2012-04-12 10:45:33
【问题描述】:

编辑:Jeremy Wall 帮助我意识到我提出的问题比我预期的更具体;这是一个更好的版本。

假设我想表示一个表,该表将某种类型 B 的值与定义了相等性的某种类型 A 的值序列相关联。在 Go 中最好的方法是什么?

显然,对于表我想使用 Go 映射,但是对于 A 类型的值序列,我可以使用什么?在 Go 中,切片不能用作 map 的键;数组可以,但是数组的长度是它类型的一部分,我对能够使用在运行时确定的长度序列感兴趣。我可以 (1) 使用 A 的数组为它们声明最大长度或 (2) 使用 A 的切片,将它们序列化为字符串以用作键(这种技术对于 Awk 和 Lua 程序员来说很熟悉......)。对于 Go 的这个“特性”,有没有比我描述的更好的解决方法?

正如 Jeremy Wall 在回答我的原始版本问题时指出的那样,我有 A = int,选项 (2) 非常适合整数,因为您可以使用符文切片,将其转换为字符串只是演员表。

【问题讨论】:

  • 我在下面给出了“一个”答案,但这个问题真的太具体了,无法真正得出任何答案。了解您具体要回答的问题会有所帮助。
  • 这个问题太具体了。我的想法是提到整数只是为了给出一个具体的例子,但我没想到对于其他类型不起作用的整数可能有一个非常好的和简单的解决方案。

标签: map go


【解决方案1】:

符文序列而不是整数对你有用吗?符文是 uint32 并且转换为字符串只是一个强制转换:

package main

import "fmt"

type myKey struct {
  seq []int
}

func main() {
    m := make(map[string]string)
    key := []rune{1, 2}
    m[string(key)] = "foo"
    fmt.Print("lookup: ", m[string(key)])
}

你可以在这里玩这个代码:http://play.golang.org/p/Kct1dum8A0

【讨论】:

  • 谢谢,这是一个巧妙的技巧!为了确保我理解:这里的变量“key”是符文的 slice 类型,对吧?这完美地涵盖了整数序列的情况,但是尽管这让我可以改进我编写的程序(枚举给定长度的所有de Bruijn sequences),但我的意思是更普遍地询问不是的值序列的问题必须只有 32 位整数。
  • 是的,关键是一片符文。请记住,符文是无符号的 32 位整数。如果您的整数序列适合,那么它们可以代表 int 的一部分。
  • 如果您的序列长度都相同,您可以使用最合适的数字类型的数组。那是数组而不是切片。数组是有效的映射键(在限制范围内......数字类型的数组没有问题。)甚至可能比切片略快。
猜你喜欢
  • 2013-09-28
  • 1970-01-01
  • 1970-01-01
  • 2019-02-20
  • 1970-01-01
  • 2019-10-23
  • 2016-04-07
  • 1970-01-01
  • 2012-11-12
相关资源
最近更新 更多