2012-04-12 19 views
2

編輯:傑里米沃爾幫助我意識到我問了一個比我想要的更具體的問題;這是一個更好的版本。如何在Go中使用任意長度的值序列作爲地圖鍵?

假設我想表示一個表格,將某些類型爲B的值與某些類型爲A的值的序列關聯起來,這些類型的值的定義是相等的。 Go的最佳做法是什麼?

很明顯,對於表我想使用一個Go地圖,但我可以使用什麼類型的值的序列?在Go中,切片不能用作地圖的鍵;數組可以,但數組的長度是其類型的一部分,我感興趣的是能夠使用在運行時確定的長度序列。我可以(1)使用A的數組來聲明它們的最大長度,或者(2)使用A的切片,將它們序列化爲字符串以用作鍵(這種技術對於Awk和Lua程序員來說是熟悉的...)。 Go的這個「功能」比我描述的更好嗎?

正如Jeremy Wall在回答我的原始版本的問題時指出的那樣,我有A = int,選項(2)對於整數非常好,因爲您可以使用符號轉換爲符號的切片只是一個演員。

+1

我給了「一個」的回答,但真正的問題是過於具體,真正引領任何形式的答案。這將有助於瞭解您正在嘗試回答的具體問題。 – 2012-04-12 02:35:02

+0

關於這個問題過於具體,這是一個很好的觀點。我的想法是提供整數來舉出一個具體的例子,但我沒有想到,對於其他類型不適用的整數可能會有一個非常好的和簡單的解決方案。 – 2012-04-12 02:42:24

回答

1

一串符文而不是整數對你有用嗎?符文UINT32和轉換爲字符串只是投:

package main 

import "fmt" 

type myKey struct { 
    seq []int 
} 

func main() { 
    m := make(map[string]string) 
    key := []rune{1, 2} 
    m[string(key)] = "foo" 
    fmt.Print("lookup: ", m[string(key)]) 
} 

你可以用這個代碼在這裏玩:http://play.golang.org/p/Kct1dum8A0

+0

謝謝,這是一個巧妙的把戲!爲了確保我明白:這裏的變量「鍵」是符文類型的_slice_,對吧?這完全涵蓋了整數序列的情況,但是,儘管這讓我改進了我編寫的程序(枚舉給定長度的所有[de Bruijn序列](http://en.wikipedia.org/wiki/De_Bruijn_sequence)), ,我本來打算更普遍地提出問題的序列值,這些值不一定只是32位整數。 – 2012-04-12 02:53:36

+0

是鑰匙是符文的一部分。請記住,符文是無符號的32位整數。如果你的整數序列符合那個,那麼它們可以代表整數。 – 2012-04-12 02:56:55

+0

如果您的序列長度相同,則可以使用最適合數字類型的數組。這陣列不分片。數組是有效的映射鍵(在限制內......數組類型的數組雖然沒有問題),甚至可能比切片快一些。 – Sonia 2012-04-12 03:49:48

相關問題