2010-08-18 46 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

相关问题