- map是存储键值对的数据结构,使用哈希表实现,map是无序的。
- map自动初始化值为nil,可以自动增长。
- 和切片一样,map也是一种引用类型。
- map是跨线程访问是不安全的,可以使用sync包中的Map来实现线程安全。
map的创建
方法一:直接定义
使用map关键字声明map,后面跟[key类型],value类型
var name map[keyType]valueType
var users = map[int]string{1: "小明", 2: "小张", 3: "小红"}
fmt.Println(users)
//将map赋值给另一个map,是引用
var users1 = users
users1[1] = "李华"
fmt.Println(users)
//访问未赋值的key
fmt.Println("value of 4:", users[4]) //返回初始值
需要注意的是,不能对一个nil的map进行赋值,将会报pinac
var values map[int]string
values[1] = "one"
//运行时报错
panic: assignment to entry in nil map
可以使用下面这种写法
var values = map[int]string{}
values[1] = "one"
方法二:使用make
和创建切片一样,使用make可以指定容量,减少扩容操作,提升性能。
//使用make创建map
var nums = make(map[string]int)
nums["one"] = 1 //不指定容量,赋值将会发生扩容操作
nums["two"] = 2
nums["three"] = 3
fmt.Println(nums) //map[one:1 three:3 two:2]
var nums1 = make(map[string]int, 10)
nums1["one"] = 1 //指定容量为10,容量内赋值不会扩容
nums1["two"] = 2
nums1["three"] = 3
fmt.Println(nums1) //map[one:1 three:3 two:2]
//使用切片作为value
var numMap = make(map[int][]string)
numMap[1] = []string{"1", "one", "一"}
numMap[2] = []string{"2", "two"}
fmt.Println(numMap) //map[1:[1 one 一] 2:[2 two]]
访问和赋值键值对
使用[key]操作符来引用key对应的变量,可以访问和赋值。
- 访问不存在的key,将会返回默认值
- 给不存在的key赋值,将会插入一个键值对
- 给存在的key赋值,将会修改键值对
var values = map[int]string{}
values[1] = "one"
fmt.Println(values[1]) //输出 one
遍历键值对
使用for...range进行遍历
var numMap = make(map[int][]string)
numMap[1] = []string{"1", "one", "一"}
numMap[2] = []string{"2", "two"}
//for...range遍历
for k, v := range numMap {
fmt.Println(k, v)
}
// 输出:
// 1 [1 one 一]
// 2 [2 two]
删除键值对
使用delete(map,key)
来删除键值对
var numMap = make(map[int][]string)
numMap[1] = []string{"1", "one", "一"}
numMap[2] = []string{"2", "two"}
delete(numMap, 1)
fmt.Println(numMap) //输出:map[2:[2 two]]
go语言的map没有清空所有元素的函数,可以直接给map变量赋值一个空的map来达到清空的目的,go的垃圾回收会回收之前的map。
numMap = make(map[int][]string) //清空numMap