创建 map
可以通过将键和值的类型传递给内置函数 make
来创建一个 map
。语法为:make(map[type of key]type of value)
personSalary := make(map[string]int)
上面的代码创建了一个名为 personSalary 的 map
。其中键的类型为 string
,值的类型为 int
。
map
的零值为 nil
。试图给一个 nil
map
添加元素会导致运行时错误。因此 map
必须通过 make
来初始化。
package main
import (
"fmt"
)
func main() {
var personSalary map[string]int
if personSalary == nil {
fmt.Println("map is nil. Going to make one.")
personSalary = make(map[string]int)
}
}
上面的程序中,personSalary 为 nil
,因此使用 make
来初始化它。
访问 map 中的元素
如果访问的键不存在,map 会返回值类型的零值。
package main
import (
"fmt"
)
func main() {
personSalary := map[string]int{
"steve": 12000,
"jamie": 15000,
}
personSalary["mike"] = 9000
employee := "jamie"
fmt.Println("Salary of", employee, "is", personSalary[employee])
fmt.Println("Salary of joe is", personSalary["joe"])
}
上面的程序输出为:
Salary of jamie is 15000
Salary of joe is 0
如何检测一个键是否存在于一个 map 中呢?可以使用下面的语法:
value, ok := map[key]
如果 ok 是 true
,则键存在,value 被赋值为对应的值。如果 ok 为 false
,则表示键不存在,value 被赋值为对应类型的零值。
map 是引用类型
与切片一样,map
是引用类型。当一个 map
赋值给一个新的变量,它们都指向同一个内部数据结构。因此改变其中一个也会影响到另一个。
比较 map
map
不能通过 == 操作符比较是否相等。== 操作符只能用来检测 map
是否为 nil
。
package main
func main() {
map1 := map[string]int{
"one": 1,
"two": 2,
}
map2 := map1
if map1 == map2 {
}
}
上面的程序将会报错:invalid operation: map1 == map2 (map can only be compared to nil)。