【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作为函数参数传递时也会发生同样的情况

posted @ 2022-07-10 14:10  郭祺迦  阅读(42)  评论(0编辑  收藏  举报