2010-08-18 73 views
13

我正在尋找與Python中的「dictionary」相似的語言功能,以便於轉換某些python代碼。是否有任何提供關聯數組能力的go庫?

編輯:地圖工作相當不錯,這個重複應用程序。我能夠在幾秒鐘內使用16字節字符串索引的地圖將1.3e6重複項目縮減爲2.5e5獨特項目。與地圖相關的代碼很簡單,所以我將它包含在下面。值得注意的地圖是預分配與1.3e6元素加速其增長只有百分之幾:

var m = make(map[string]int, 1300000) // map with initial space for 1.3e6 elements 

ct, ok := m[ax_hash] 
if ok { 
    m[ax_hash] = ct + 1 
} else { 
    m[ax_hash] = 1 
} 
+0

不需要條件語句,只需執行'm [key] ++'就更加通俗易懂。如果密鑰確實存在,則獲得零值。 – 2015-09-10 11:30:09

回答

9

地圖類型。 http://golang.org/doc/effective_go.html#maps

有蟒蛇在一些區別的關鍵,必須輸入, ,所以你不能混用數字和字符串鍵 (由於某種原因,我忘了你可以),但他們很容易使用。

dict := make(map[string]string) 
dict["user"] = "so_user" 
dict["pass"] = "l33t_pass1" 
+1

如果您不介意鍵入斷言,鍵入開關或甚至可能反射以再次獲取值,則可以使map [string] interface {}包含混合類型。 – 2010-08-18 20:49:30

+0

所有的鍵都是字符串值,所以我認爲這會很好用 – Hotei 2010-08-18 21:16:18

+0

@Chickencha yah我只是指鍵的類型。我使用map [string] interface {} – cthom06 2010-08-19 11:24:31

0

你可能尋找一個map

29

爲了擴大一點就已經給了答案:

一去的地圖是類型化的哈希映射數據結構。地圖的類型簽名的格式爲map[keyType]valueType,其中keyTypevalueType分別是鍵和值的類型。

要初始化地圖,你必須使用make功能:

m := make(map[string]int) 

未初始化的地圖等於nil,如果讀取或寫入恐慌將出現在運行時。

用於存儲值的語法是一樣一樣的使用數組或切片這樣做:

m["Alice"] = 21 
m["Bob"] = 17 

同樣,從地圖檢索值可以這樣判定:

a := m["Alice"] 
b := m["Bob"] 

您可以使用range關鍵字用於遍歷for循環的地圖:

for k, v := range m { 
    fmt.Println(k, v) 
} 

這個代碼將打印:

Alice 21 
Bob 17 

檢索的關鍵不在地圖將返回值類型的零值的值:

c := m["Charlie"] 
// c == 0 

通過從地圖讀取多個值,可以測試密鑰的存在。第二個值將是一個布爾值,指示鍵的存在:

a, ok := m["Alice"] 
// a == 21, ok == true 
c, ok := m["Charlie"] 
// c == 0, ok == false 

要從地圖的鍵/值項,你翻轉過來,並指定false作爲第二個值:

m["Bob"] = 0, false 
b, ok := m["Bob"] 
// b == 0, ok == false 

n := make(map[string]interface{}) 
n["One"] = 1 
n["Two"] = "Two" 

唯一條件是檢索這些值時:可以通過使用空接口類型interface{}存儲在地圖任意類型你必須執行一個類型斷言使用它們原來的形式:

a := n["One"].(int) 
b := n["Two"].(string) 

可以使用式開關,以確定各類你拉出值,並與他們妥善處理:

for k, v := range n { 
    switch u := v.(type) { 
     case int: 
      fmt.Printf("Key %q is an int with the value %v.\n", k, u) 
     case string: 
      fmt.Printf("Key %q is a string with the value %q.\n", k, u) 
    } 
} 

在這些case塊的每一箇中,u將是case聲明中指定的類型;沒有明確的類型斷言是必要的。

此代碼將打印:

Key "One" is an int with the value 1. 
Key "Two" is a string with the value "Two". 

密鑰可以是用於其等於運算符被定義,如整數的任何類型,浮點數,字符串和指針。只要底層類型支持相等性,也可以使用接口類型。 (結構,數組和切片不能被用作映射鍵,因爲平等未在這些類型的定義。)

例如,地圖o可以採取任何上述類型的鍵:

o := make(map[interface{}]int) 
o[1] = 1 
o["Two"] = 2 

簡而言之,這就是地圖。

+0

更像是簡單的地圖和類型開關,帶有一個空的inerface {}。優秀的答案。 – cthom06 2010-08-23 12:56:09

+0

接口{}鍵爲+1,很酷,我錯過了這個感謝 – zupa 2014-04-17 07:35:35

相關問題