假设我们有一个map[int]string
,我们想要这样定义:
var a map[int]string = {
1: "some"
3: "value"
4: "maintained"
7: "manually"
// more 100 entries...
}
我想手动维护这些值,因为它们没有模式,但键有。有没有办法像使用1 << 1 + iota
?
我不想问是否可以使用iota作为地图密钥(不幸的是它不是AFAIK),就好像有一种同样优雅的方式来创建定义的密钥序列
答案 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
}