【Go】30、golang map
- map是一种key:value键值对的数据结构容器。map内部实现是哈希表(hash)
- map最重要的一点是通过key来快速检索数据,key类似于索引,指向数据的值
- map是无序的
- map是引用类型的
- map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用。
1、map的语法格式
- 可以使用内建函数make也可以使用map关键字来定义map
// 声明变量,默认map是nil
var map_variable = map[key_data_type]value_data_type
// 使用make函数
map_variable = make(map[key_data_type]value_data_type)
- map_variable:map变量名称
- key_data_type:key的数据类型
- value_data_type:值的数据类型
2、实例
- 下面声明一个保存个人信息的map
func f1() {
// make声明
m1 := make(map[string]string)
m1["name"] = "tom"
m1["age"] = "20"
m1["email"] = "tom@qq.com"
fmt.Printf("m1: %v\n", m1)
// map声明并直接初始化
m2 := map[string]string{
"name": "kite",
"age": "20",
"email": "kite@qq.com",
}
fmt.Printf("m2: %v\n", m2)
}
func main() {
f1()
}
# 输出结果:
m1: map[age:20 email:tom@qq.com name:tom]
m2: map[age:20 email:kite@qq.com name:kite]
3、访问map
- 可以通过下标key获得其值,例如:
func f2() {
// 通过下标key获得其值
m1 := map[string]string{
"name": "tom",
"age": "21",
"email": "123@qq.com",
}
name := m1["name"]
age := m1["age"]
email := m1["email"]
fmt.Printf("name: %v\n", name)
fmt.Printf("age: %v\n", age)
fmt.Printf("email: %v\n", email)
}
func main() {
f2()
}
# 输出结果:
name: tom
age: 21
email: 123@qq.com
4、判断某个键是否存在
- go语言中有个判断map中键是否存在的特殊写法,格式如下:
value, ok := map[key]
- 如果ok为true则存在;否则不存在
func f3() {
// 判断某个键是否存在
var m1 = map[string]string{
"name": "tom",
"age": "21",
"email": "123@qq.com",
}
var k1 = "name"
var k2 = "age1"
value, ok := m1[k1]
fmt.Printf("value: %v\n", value)
fmt.Printf("ok: %v\n", ok)
v, ok := m1[k2]
fmt.Printf("v: %v\n", v)
fmt.Printf("ok: %v\n", ok)
}
func main() {
f3()
}
# 输出结果:
value: tom
ok: true
v:
ok: false
5、遍历map--遍历key
- 可以使用for range循环进行map遍历,得到value和key值
- 语法:
for key := range map{}
func f4() {
// 遍历key
m := map[string]string{"name": "xiaosan", "age": "18", "tui": "haochang"}
for k := range m {
fmt.Printf("k: %v\n", k)
}
}
func main() {
f4()
}
# 输出结果:
k: name
k: age
k: tui
6、遍历map--遍历key value
- 语法:
for key value := range map {}
func f5() {
// 遍历key和value
m := map[string]string{"name": "xiaosan", "age": "18", "tui": "haochang"}
for key, value := range m {
fmt.Printf("key: %v, value: %v \n", key, value)
}
}
func main() {
f5()
}
# 输出结果:
key: age, value: 18
key: tui, value: haochang
key: name, value: xiaosan
7、使用delete()函数删除键值对
- 语法如下:
delete(map, key)
# 其中:
map:表示要删除键值对的map
key:表示要删除的键值对的键
func f6() {
// 从map中删除一组键值对
m := map[string]string{"name": "xiaosan", "age": "18", "tui": "haochang"}
delete(m, "name")
fmt.Printf("m: %v\n", m)
}
func main() {
f6()
}
# 输出结果:
m: map[age:18 tui:haochang]
8、map是引用类型
- 当map是被赋值为一个新变量的时候,他们指向同一个内部数据结构。因此,改变其中一个变量,就会影响到另一个变量。
func f10() {
steps4 := map[string]string{
"第一步": "Go语言极简一本书",
"第二步": "Go语言微服务架构核心22讲",
"第三步": "从0到Go语言微服务架构师",
}
fmt.Printf("steps4: %v\n", steps4)
newStep4 := steps4
newStep4["第一步"] = "Go语言极简一本书--222"
newStep4["第二步"] = "Go语言微服务架构核心22讲--222"
newStep4["第三步"] = "从0到Go语言微服务架构师--222"
fmt.Printf("newStep4: %v\n", newStep4)
fmt.Printf("steps4: %v\n", steps4)
}
func main() {
f10()
}
# 输出结果:
steps4: map[第一步:Go语言极简一本书 第三步:从0到Go语言微服务架构师 第二步:Go语言微服务架构核心22讲]
newStep4: map[第一步:Go语言极简一本书--222 第三步:从0到Go语言微服务架构师--222 第二步:Go语言微服务架构核心22讲--222]
steps4: map[第一步:Go语言极简一本书--222 第三步:从0到Go语言微服务架构师--222 第二步:Go语言微服务架构核心22讲--222]
- 当map作为函数参数传递时也会发生同样的情况
本文来自博客园,作者:郭祺迦,转载请注明原文链接:https://www.cnblogs.com/guojie-guojie/p/16463106.html