为了扩大一点就已经给了答案:
一去的地图是类型化的哈希映射数据结构。地图的类型签名的格式为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
检索的关键不在地图将返回值类型的零值的值:
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
简而言之,这就是地图。
不需要条件语句,只需执行'm [key] ++'就更加通俗易懂。如果密钥确实存在,则获得零值。 – 2015-09-10 11:30:09