GO系列
1、GO学习之Hello World
2、GO学习之入门语法
3、GO学习之切片操作
4、GO学习之 Map 操作
5、GO学习之 结构体 操作
文章目录
- GO系列
- 前言
- 一、什么是Map
- 二、Map的基本操作
- 2.1 定义map
- 2.2 添加和修改键值对
- 2.3 删除键值对
- 2.4 遍历键值对
- 2.5 判断某个key是否存在
- 三、总结
前言
按照公司目前的任务,go 学习是必经之路了,虽然行业卷,不过技多不压身,依旧努力!!!
前面学习了切片操作,对切片有了基本的认识,还有一些基础操作的认识,发现还是和 JAVA 的 List操作有很大区别,今天来认识一下Map以及如何操作的。
一、什么是Map
首先,什么是 Map 呢?就是一种无序的以 key-value 键值对方式存储的数据结构,在 Go 语言中,Map也一样,类似于哈希或者字典,是引用类型,所以必须初始化才能使用,适用于快速查找和存储键值对的场景。
Map 是一种引用类型,需要 make() 函数来创建, 这样来定义 map[键类型]值类型,例如 map[string]int 表示键为字符串类型,值为整数类型的 map。
- 创建一个空的 map: myMap := make(map[string]int)。
- 使用 map 的名称来添加或修改对于的值,myMap[“a”] = “100”。
- 使用 map 的名称来获取对应的值,value := myMap[“a”]。
- 使用 delete() 函数来删除 map 中的键值对, delete(myMap, “a”)。
- 使用 “for range” 来循环遍历 map 中的键值对, for key, value := range myMap{}。
- 使用 len() 函数获取 map 中键值对的数量, length := len(myMap),需要注意的是,map 中键必须是支持相等操作的类型,比如 整数、字符串、浮点数、指针、数组、结构体等,而值可以是任何类型;另外 map 是无须的结构,遍历 map 的顺序是不确定的。
二、Map的基本操作
2.1 定义map
下面的示例中,定义了一个 map 类型的变量 myMap,从运行结果可以看出,定义的 map 是空的。
可以在什么的时候指定容量,这样就不会导致容量不够扩容而消耗性能了。
也可以在声明的时候初始化值,有时候在开发中需要定义一个字段来使用。
package mainimport "fmt"func main() {// 定义一个空的mapemptyMap := make(map[string]int)// 可以指定map的容量,也可以不指定myMap := make(map[string]int, 8)// 往 myMap 中添加值myMap["a"] = 1myMap["b"] = 2myMap["c"] = 3fmt.Println(myMap)// 声明的时候添加元素dictMap := map[string]string{"001": "男","002": "女","003": "未知",}fmt.Println(dictMap)
}
运行结果:
PS D:\workspaceGo> go run map.go
map[]
map[a:1 b:2 c:3]
map[001:男 002:女 003:未知]
2.2 添加和修改键值对
package mainimport "fmt"func main() {myMap := make(map[string]int)// 往 myMap 中添加值myMap["a"] = 1myMap["b"] = 2myMap["c"] = 3myMap["d"] = 4myMap["e"] = 5fmt.Println("修改后的map: ", myMap)// 修改 map 中的值myMap["e"] = 500fmt.Println("修改后的map: ", myMap)
}
运行结果:
PS D:\workspaceGo> go run map.go
修改后的map: map[a:1 b:2 c:3 d:4 e:5]
修改后的map: map[a:1 b:2 c:3 d:4 e:500]
2.3 删除键值对
package mainimport "fmt"func main() {myMap := make(map[string]int)// 往 myMap 中添加值myMap["a"] = 1myMap["b"] = 2myMap["c"] = 3myMap["d"] = 4myMap["e"] = 5fmt.Println("删除后的map: ", myMap)// 删除 map 中的值delete(myMap, "a")delete(myMap, "e")fmt.Println("删除后的map: ", myMap)
}
运行结果:
PS D:\workspaceGo> go run map.go
删除后的map: map[a:1 b:2 c:3 d:4 e:5]
删除后的map: map[b:2 c:3 d:4]
2.4 遍历键值对
- 基本的遍历
package mainimport "fmt"func main() {myMap := make(map[string]int)// 往 myMap 中添加值myMap["a"] = 1myMap["b"] = 2myMap["c"] = 3myMap["d"] = 4myMap["e"] = 5length := len(myMap)fmt.Println("map的长度:", length)// 遍历 mapfor key, value := range myMap {fmt.Println("key: ", key, ", value: ", value)}
}
运行结果:
PS D:\workspaceGo> go run map.go
map的长度: 5
key: a , value: 1
key: b , value: 2
key: c , value: 3
key: d , value: 4
key: e , value: 5
PS D:\workspaceGo> go run map.go
map的长度: 5
key: e , value: 5
key: a , value: 1
key: b , value: 2
key: c , value: 3
key: d , value: 4
注:这里我执行了两次,可以看出两次遍历打印出来的顺序都会不一样的,所以 map 是无须的键值对数据结构。
- 忽略键或者值的写法
// 只需要值,不需要 keyfor _, v := range myMap {fmt.Println("值为:", v)}for k, _ := range myMap {fmt.Println("键为:", k)}
- 顺序遍历 map
...声明 myMap 代码省略,同上//声明切片用来存放 kaykeys := []string{}for key := range myMap {keys = append(keys, key)}//对切片进行排序sort.Strings(keys)//遍历切片来获取 map 元素for _, k := range keys {fmt.Println(k, myMap[k])}
运行结果:
a 1
b 2
c 3
d 4
e 5
2.5 判断某个key是否存在
package mainimport "fmt"func main() {myMap := make(map[string]int, 8)// 往 myMap 中添加值myMap["a"] = 1myMap["b"] = 2myMap["c"] = 3value, ok := myMap["d"]if ok {fmt.Println(value)} else {fmt.Println("没有这个键")}v, exists := myMap["a"]if exists {fmt.Println("a 的值为:", v)} else {fmt.Println("没有a")}
}
运行结果:
PS D:\workspaceGo> go run map.go
没有这个键
a 的值为: 1
三、总结
其实 map 还是比较容易上手的,初始化和操作都比较容易的。
我主张每篇博客都不要长篇大论,这样有需要的人也能很容易检索到想要的结果,自己在后面复习巩固的时候也不会看自己的博客疲劳。