是否有任何提供关联数组功能的库?

Hot*_*tei 13 dictionary go data-structures

我正在寻找类似于python中的"字典"的go语言功能,以便于转换一些python代码.

编辑:地图在这个重复数据删除应用程序中运行良好.我能够在几秒钟内使用带有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
}
Run Code Online (Sandbox Code Playgroud)

小智 29

为了扩大已经给出的答案:

Go map是类型化的哈希映射数据结构.地图的类型签名是窗体的map[keyType]valueType其中keyTypevalueType分别是类型的键和值的.

要初始化地图,您必须使用以下make功能:

m := make(map[string]int)
Run Code Online (Sandbox Code Playgroud)

未初始化的映射等于nil,如果读取或写入,将在运行时发生混乱.

存储值的语法与使用数组或切片的语法非常相似:

m["Alice"] = 21
m["Bob"] = 17
Run Code Online (Sandbox Code Playgroud)

同样,从地图中检索值的方式如下:

a := m["Alice"]
b := m["Bob"]
Run Code Online (Sandbox Code Playgroud)

您可以使用range关键字迭代迭代地图for:

for k, v := range m {
    fmt.Println(k, v)
}
Run Code Online (Sandbox Code Playgroud)

此代码将打印:

Alice 21
Bob 17
Run Code Online (Sandbox Code Playgroud)

检索不在映射中的键的值将返回值类型的零值:

c := m["Charlie"]
// c == 0
Run Code Online (Sandbox Code Playgroud)

通过从地图中读取多个值,您可以测试密钥的存在.第二个值是一个布尔值,表示密钥的存在:

a, ok := m["Alice"]
// a == 21, ok == true
c, ok := m["Charlie"]
// c == 0, ok == false
Run Code Online (Sandbox Code Playgroud)

要从地图中删除键/值条目,请将其翻转并指定false为第二个值:

m["Bob"] = 0, false
b, ok := m["Bob"]
// b == 0, ok == false
Run Code Online (Sandbox Code Playgroud)

您可以使用空接口类型在地图中存储任意类型interface{}:

n := make(map[string]interface{})
n["One"] = 1
n["Two"] = "Two"
Run Code Online (Sandbox Code Playgroud)

唯一的附带条件是,在检索这些值时,您必须执行类型断言才能以原始形式使用它们:

a := n["One"].(int)
b := n["Two"].(string)
Run Code Online (Sandbox Code Playgroud)

您可以使用类型开关来确定要提取的值的类型,并适当地处理它们:

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

在每个case块中,u将是case语句中指定的类型; 没有明确的类型断言是必要的.

此代码将打印:

Key "One" is an int with the value 1.
Key "Two" is a string with the value "Two".
Run Code Online (Sandbox Code Playgroud)

键可以是定义了相等运算符的任何类型,例如整数,浮点数,字符串和指针.只要底层类型支持相等,也可以使用接口类型.(结构,数组和切片不能用作映射键,因为没有在这些类型上定义相等.)

例如,地图o可以获取以上任何类型的键:

o := make(map[interface{}]int)
o[1] = 1
o["Two"] = 2
Run Code Online (Sandbox Code Playgroud)

简而言之,这就是地图.


cth*_*m06 9

地图类型.http://golang.org/doc/effective_go.html#maps

与python有一些区别,因为键必须键入,所以你不能混合数字和字符串键(出于某种原因我忘了你可以),但它们很容易使用.

dict := make(map[string]string)
dict["user"] = "so_user"
dict["pass"] = "l33t_pass1"
Run Code Online (Sandbox Code Playgroud)