Data structures 是否有提供关联阵列功能的go库?

Data structures 是否有提供关联阵列功能的go库?,data-structures,dictionary,go,Data Structures,Dictionary,Go,我正在寻找一种类似于python中的“字典”的go语言功能,以促进某些python代码的转换 编辑:Maps在这个重复数据消除应用程序中运行得非常好。我能够使用一个带有16字节字符串索引的映射,在几秒钟内将1.3e6重复项压缩为2.5e5唯一项。与地图相关的代码很简单,因此我将其包含在下面。值得注意的是,预分配带有1.3e6元素的map只将其加速了几个百分点: var m = make(map[string]int, 1300000) // map with initial space for

我正在寻找一种类似于python中的“字典”的go语言功能,以促进某些python代码的转换

编辑:Maps在这个重复数据消除应用程序中运行得非常好。我能够使用一个带有16字节字符串索引的映射,在几秒钟内将1.3e6重复项压缩为2.5e5唯一项。与地图相关的代码很简单,因此我将其包含在下面。值得注意的是,预分配带有1.3e6元素的map只将其加速了几个百分点:

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
}

您可能正在寻找一个。

地图类型

与python的不同之处在于,键必须是类型化的,因此不能混合使用数字键和字符串键(出于某种原因,我忘了您可以),但它们非常容易使用

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

要对已经给出的答案进行一点扩展:

Go映射是一种类型化的哈希映射数据结构。映射的类型签名的形式为
map[keyType]valueType
,其中
keyType
valueType
分别是键和值的类型

要初始化地图,必须使用
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
Key "One" is an int with the value 1.
Key "Two" is a string with the value "Two".
检索不在映射中的键的值将返回值类型的零值:

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
通过使用空接口类型
interface{}
,可以在映射中存储任意类型:

n := make(map[string]interface{})
n["One"] = 1
n["Two"] = "Two"
唯一的限制条件是,在检索这些值时,必须执行类型断言以原始形式使用它们:

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
语句中指定的类型;不需要显式类型断言

此代码将打印:

Alice 21
Bob 17
Key "One" is an int with the value 1.
Key "Two" is a string with the value "Two".
键可以是定义了相等运算符的任何类型,例如整数、浮点、字符串和指针。只要基础类型支持相等,也可以使用接口类型。(结构、数组和切片不能用作映射键,因为这些类型上未定义相等。)

例如,map
o
可以使用上述任何类型的键:

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

简而言之,这就是映射。

如果您不介意类型断言、类型切换,甚至可能是反射来再次获取值,那么您可以创建一个映射[string]接口{}来包含混合类型。所有键都将是字符串值,所以我认为这只会起作用fine@Chickencha是的,我只是指钥匙的类型。我使用map[string]接口{}相当多bit@chthom06甚至map[interface{}]interface{}也是允许的,尽管我认为作为键的结构或片可能会导致运行时恐慌,因为它们无法比较。@Chickencha出于某种原因,我在脑子里想map[interface{}]只对指针起作用,但它肯定对字符串和数字起作用。但你们说得对,结构和切片是不可能的。更像是简而言之的映射和类型开关,带有一点空的inerface{}。回答得很好。不需要条件,只需执行
m[key]++
更为惯用。如果密钥确实存在,则得到零值。