Go语言map用法
Go语言的 map 数据结构是一种 键值对 的集合 。 通过 key 来访问数据。
map 是使用 hash 表来实现的,所以 map 是无序的,无法决定它的返回顺序。
1 map 的定义
可以使用 var , map 关键字来定义,也可以使用内置的 make()
函数来定义
- 第 1 种 :使用 var , map 定义,语法为:
var 名字 map[key的类型] value的类型
- 第 2 种:使用 make 函数定义,语法为:
名字 := make(map[key的类型] value的类型)
使用语法太抽象,直接看下面的例子
示例一 : 使用 var , map 定义
var dict map[string]int
上面声明了一个map dict , key 是 string 类型, 值是 int 类型的 map
注意:直接通过 var 声明的map ,默认是 nil , 不能直赋值, 比如:dict["tom"] = 23
执行时就会报错的。
这一点和切片不一样,nil 切片是可以添加元素的。但是 map 不行
示例二:使用 make() 函数定义
dict := make(map[string]int)
上面直接通过 make()
函数定义了一个map , 此时的 map 不为 nil , 已经分配了内存空间了,是可以正常使用的。
2 map 的读写
map 通过 键(key) 进行读取来赋值。看下面的例子
示例:
func main() { //键是string,值是int的map dict := make(map[string]int) dict["tom"] = 23 dict["jim"] = 22 fmt.Println( dict ) //输出:map[jim:22 tom:23] fmt.Println( dict["tom"] ) //输出:23 //修改其中一个 dict["jim"] = 25 fmt.Println( dict ) //输出:map[jim:25 tom:23] fmt.Println( dict["tom"] ) //输出:23 }
3 map 的遍历
前面的循环语句的那一个章节,介绍 for 语句用来循环数组,切片用
本节介绍使用 for
语句,再配合另一个关键字 range
来遍历 map
range
是范围的意思 ,可以配合 for
对数组,切片,map进行遍历
示例: for 结合 range 遍历 map
func main() { dict := make(map[string]int) dict["tom"] = 23 dict["jim"] = 22 dict["bob"] = 27 for k , v := range dict { fmt.Println("k=",k, " v=",v) } }
如果只使用 k , 或者 v 中的一个,可以用 _
把不用的丢弃掉,如下
示例:
func main() { dict := make(map[string]int) dict["tom"] = 23 dict["jim"] = 22 dict["bob"] = 27 for _, v := range dict { fmt.Println(v) } } //输出如下: 23 22 27
4 查看元素是否存在map中
如上面的例子,如何查看 dict 中是否存在 bob 呢?
一样的示例,如下:
func main() { dict := make(map[string]int) dict["tom"] = 23 dict["jim"] = 22 dict["bob"] = 27 age , ok := dict["bob"] if ok { fmt.Println("存在,年龄是:", age) }else { fmt.Println("不存在") } } //输出: 存在,年龄是: 27
上面的例子,如果我们换成 bob2 呢,如下:
age , ok := dict["bob2"] if ok { fmt.Println("存在,年龄是:", age) }else { fmt.Println("不存在") } //输出:不存在
5 如何删除一个键值对
还是上面的例子,如何想把 bob 删除,怎么做呢?
可以傅内置的 delete()
函数,如下:
func main() { dict := make(map[string]int) dict["tom"] = 23 dict["jim"] = 22 dict["bob"] = 27 fmt.Println(dict) //删除前,输出:map[bob:27 jim:22 tom:23] delete(dict,"bob") fmt.Println(dict) //删除后,输出:map[jim:22 tom:23] } //输出如下: map[bob:27 jim:22 tom:23] map[jim:22 tom:23]
由上述可知,dict 少了一个键值对
6 获取map键值对的数量
map 中有多少个键值对,可以使用 内置的len()
函数获取
如下:
func main() { dict := make(map[string]int) dict["tom"] = 23 dict["jim"] = 22 length := len(dict) fmt.Println( length ) } //输出:2
小结
上面介绍了 Go语言中 map 的概念以及用法,下面简单总结一下:
-
map
是一个关键字,是声明 map 用的。 -
map 是无序的键值对集合,是通过 hash 实现的
-
map 的定义有两种方式
-
使用
var dict map[string]int
这种方式 ,此时 dict 是 nil ,是不能添加元素的。 -
使用
dict := make(map[string]int)
这种方式,此时dict 不为 nil ,是可以添加元素的。 -
直接通过 key 来访问元素,比如:
dict["tom"] = 23
-
查看是否存在某个键值对,可以使用
value, ok := dict["tom"]
这种方式。 ok 为 true ,说明存在,此时value 就是 key对应的值 -
使用
len()
函数获取 map 的键值对的数量
-
-
map 的遍历 ,使用
for
语句结合range
关键字,遍历