一、map
1. 简介
map是Go的内置类型,是键值对(key-value)的形式,不再赘述。
2. 语法
map类型的表示语法为:map[KeyType]ValueType
3. 声明
可以用普通的声明方式,也可以用速记声明,还可以声明同时初始化,如下:
salary := make(map[string]int) //速记声明
var salary2 map[string]int //普通声明
//声明同时初始化
salary3 := map[string]int {
"Iverson" : 2400,
"kobe" : 2280,
"TMAC" : 2300,
}
map的初始值为nil,对nil map进行操作会导致运行时错误,如果声明时没有初始化,则必须要用make函数创建后或才能使用。
像上面的第二种方式声明的salary2,如果直接对其进行操作,就会出错,第一个没问题。
4. 创建map
Go语言内置的make函数可以用来创建一个map,语法为 make(map[KeyType]ValueType),如下:
var salary2 map[string]int
if salary2 == nil {
fmt.Println("[salary2 is nil, please Make it]") //map没有被创建,为nil map
salary2 = make(map[string]int)
}
注意:nil并不表示map的元素是否为空,而是表示map是否创建,如果map已被创建,即使没有元素,也不为nil,如下:
salary := make(map[string]int)
if salary != nil {
fmt.Println("salary is not nil") //此句被执行,nil并不代码map元素是否为空
}
5. 插入、访问元素
直接用赋值的方式向map中插入元素,如下:
salary["James"] = 1800 //插入
salary["James"] = 1900 //修改
salary["Wade"] = 1750
fmt.Println("Salary of James is", salary["James"]) //访问元素
fmt.Println("Salary of Iverson is", salary["Iverson"]) //访问一个不存在的元素,返回value类型的零值
注意:如果访问了一个不存在的元素,那么会返回该value类型的零值。
7. 判断是否存在某元素
语法:value, ok := mapName[Key]
这样可以检测一个key是否存在于map中,如果存在,ok为true,value被赋上对应的值;若不存在,ok为false,value为该类型的零值,如下:
value, ok := salary["Curry"]
if ok == true {
fmt.Println("Salary of Curry is", value)
}else {
fmt.Println("Curry doesn't exist, value is", value)
}
8. 遍历(排序)
map也可以用range来遍历,它会返回两个变量,第一个是key,第二个是value,如下:
for k, v:= range salary {
fmt.Printf("salary[%s] = %d\n", k, v)
}
注意:map是无序的, 所以每次遍历,顺序可能会不一样。
9. 删除元素
语法:delete(mapName, Key)
若删除了一个不存在的值,不会报错,也不会改变map,如下:
delete(salary, "Wade") //删除一个存在的元素
delete(salary, "Iverson") //删除一个不存在的元素
10. 元素个数
用内置函数len()获取元素个数。
语法len(mapName),如下:
fmt.Println("Length of salary is", len(salary))
11. map是引用类型
与切片一样,map也是引用类型,故它也有以下特性:
--当一个map赋值给一个新的map变量,它们都指向同一个底层的数据。因此,改变其中一个对另一个也有影响
--当map作为函数参数传递时,函数内对map的操作也会影响原map
salary["Curry"] = 500
new_salary := salary
new_salary["Curry"] = 540
fmt.Println(salary) //Curry的结果为540,因为对new_salary操作也会影响原mapsalary