1、GO学习之Hello World
2、GO学习之入门语法
3、GO学习之切片操作
4、GO学习之 Map 操作
5、GO学习之 结构体 操作
按照公司目前的任务,go 学习是必经之路了,虽然行业卷,不过技多不压身,依旧努力!!!
前面学习了切片操作,对切片有了基本的认识,还有一些基础操作的认识,发现还是和 JAVA 的 List操作有很大区别,今天来认识一下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 类型的变量 myMap,从运行结果可以看出,定义的 map 是空的。
可以在什么的时候指定容量,这样就不会导致容量不够扩容而消耗性能了。
也可以在声明的时候初始化值,有时候在开发中需要定义一个字段来使用。
package main
import "fmt"
func main() {
// 定义一个空的map
emptyMap := make(map[string]int)
// 可以指定map的容量,也可以不指定
myMap := make(map[string]int, 8)
// 往 myMap 中添加值
myMap["a"] = 1
myMap["b"] = 2
myMap["c"] = 3
fmt.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:未知]
package main
import "fmt"
func main() {
myMap := make(map[string]int)
// 往 myMap 中添加值
myMap["a"] = 1
myMap["b"] = 2
myMap["c"] = 3
myMap["d"] = 4
myMap["e"] = 5
fmt.Println("修改后的map: ", myMap)
// 修改 map 中的值
myMap["e"] = 500
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[a:1 b:2 c:3 d:4 e:500]
package main
import "fmt"
func main() {
myMap := make(map[string]int)
// 往 myMap 中添加值
myMap["a"] = 1
myMap["b"] = 2
myMap["c"] = 3
myMap["d"] = 4
myMap["e"] = 5
fmt.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]
package main
import "fmt"
func main() {
myMap := make(map[string]int)
// 往 myMap 中添加值
myMap["a"] = 1
myMap["b"] = 2
myMap["c"] = 3
myMap["d"] = 4
myMap["e"] = 5
length := len(myMap)
fmt.Println("map的长度:", length)
// 遍历 map
for 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 是无须的键值对数据结构。
// 只需要值,不需要 key
for _, v := range myMap {
fmt.Println("值为:", v)
}
for k, _ := range myMap {
fmt.Println("键为:", k)
}
...声明 myMap 代码省略,同上
//声明切片用来存放 kay
keys := []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
package main
import "fmt"
func main() {
myMap := make(map[string]int, 8)
// 往 myMap 中添加值
myMap["a"] = 1
myMap["b"] = 2
myMap["c"] = 3
value, 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 还是比较容易上手的,初始化和操作都比较容易的。
我主张每篇博客都不要长篇大论,这样有需要的人也能很容易检索到想要的结果,自己在后面复习巩固的时候也不会看自己的博客疲劳。