2014-12-07 109 views
1

让我们假设我们有一个map[int]string,我们要定义这样的:Iota在Go地图上定义密钥?

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

我想,因为他们没有模式手动维护的值,但按键则有。有没有办法像使用1 << 1 + iota那样使用枚举值来维护密钥列表?

我不问是否有可能使用iota作为映射键(不幸的是它不是AFAIK),就好像有一个同样优雅的方法来创建定义的序列上的键。

+1

能够在Go中随处使用iotas真的很棒,尽管 – marcio 2014-12-07 04:13:55

回答

3

你最好的选择是有序值存储为一个切片,然后用一个初始化函数生成的地图是这样的:

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

使用['make(T,n)'](http://golang.org/ref/spec#Making_slices_maps_and_channels)类型为T的地图例如,'a = make(map [int] string,len(vals))' – peterSO 2014-12-07 04:17:45

+1

这会增加一些性能,但地图仍然摊销O(1),这是在初始化。我觉得它只是从答案的角度分散注意力。 – joshlf 2014-12-07 04:53:54

+0

是的,不幸的是没有像iota那样优雅。谢谢。 – marcio 2014-12-07 04:56:41

1

一种方法是将数组/片段的所有单词循环与此类似;

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

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