1

假设我们有一个map[int]string并且我们想像这样定义它:

var a map[int]string =  {
 1: "some"
 3: "value"
 4: "maintained"
 7: "manually"
 // more 100 entries...
}

我想手动维护这些值,因为它们没有模式,但键有。有没有办法像我们使用枚举值一样维护密钥列表1 << 1 + iota

我不是在问是否可以将 iota 用作映射键(不幸的是它不是 AFAIK),只要有一种同样优雅的方法可以在定义的序列上创建键。

4

2 回答 2

3

最好的办法是将有序值存储为切片,然后使用 init 函数生成如下映射:

var a map[int]string
var vals = []string{
    "some",
    "value",
    "maintained",
    "manually",
}

func init() {
    a = make(map[int]string)
    for idx, val := range vals {
        a[idxToKey(idx)] = val
    }
}

func idxToKey(i int) int {
    return 1<<1 + i
}

在Go Playground上运行它。

您可以更改idxToKey为您想要的任何转换。我已经使用了你在这种情况下提供的那个,但它可以是任何东西。该参数位于您通常放置iota关键字的位置。

于 2014-12-07T04:11:02.897 回答
1

一种方法是有一个所有单词的数组/切片并类似于此循环;

var words []string
var a map[int]string

for i, v := range words {
   a[1 << 1 + i] = v
}
于 2014-12-07T04:07:53.920 回答