Iota在Go地图上定义键?

时间:2014-12-07 04:01:44

标签: go iota

假设我们有一个map[int]string,我们想要这样定义:

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

我想手动维护这些值,因为它们没有模式,但键有。有没有办法像使用1 << 1 + iota

那样维护密钥列表

我不想问是否可以使用iota作为地图密钥(不幸的是它不是AFAIK),就好像有一种同样优雅的方式来创建定义的密钥序列

2 个答案:

答案 0 :(得分: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关键字的位置。

答案 1 :(得分:1)

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

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

for i, v := range words {
   a[1 << 1 + i] = v
}