2014-12-07 43 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 
}