当前位置: 首页 > 工具软件 > Hero-Go > 使用案例 >

老奶奶可以看懂系列之---Golang的Map映射

吕承福
2023-12-01

前言

这里总结的Golang 笔记只适合有点编程基础的人看,比如Java

往期内容:

  1. Golang学习 【day1】变量、类型
  2. Golang学习,指针,循环控制相关
  3. 循环结构控制、包函数的使用
  4. 异常处理、数组
  5. 老奶奶可以看懂的切片

Map

Go语言中 map 是一种特殊的数据结构,一种元素对的无序集合,对应一个 key(索引)和一个 value(值),所以这个结构也称为关联数组或字典,这是一种能够快速寻找值的理想结构,给定 key,就可以迅速找到对应的 value。
与Java之中Map接口中对应的实现类差不多,HashMap、HashTable等。

Map特点

  • map之前一定需要使用make创建空间。
  • map中key是不能重复的,如果重复会覆盖前一次val存储新的val。
  • map的val是可以相同的。
  • map中的key-val是无序的。
  • 初始分配的创建取决于size,产生映射的长度为0或者size可以省略,这种情况下就会分配一个小的起始的大小,map会自动扩容的。

创建Map的三种方式

Map的创建和使用有以下三种。

func Test1()  {
	maps := make(map[string] string)
	maps["陕西"] = "西安"
	maps["山西"] = "太原"
	fmt.Println(maps)
}

func Test2() {
	maps := map[string]string{
		"hero1": "songjiang",
		"hero2": "wusong",
	}
	fmt.Println(maps)
}

func Test3() {
	var maps map[string]int
	maps = make(map[string]int, 10)
	maps["高数"] = 90
	maps["英语"] = 60
	maps["语文"] = 100
	fmt.Println(maps)
}

Map的增加和删除

Map中增加直接使用maps[“varName”] = val。
Map中删除可以使用内置函数delete,如果对应key不存在的时候,delete的时候也不会报错,存在删除对应的key。
使用mapName[“KeyName”]可以查找Map

func main() {
	add := make(map[string]string)
	add["shanxi"] = "xian"
	add["shan`xi"] = "taiyuan"
	add["fujian"] = "xiameng"
	fmt.Println("原map:", add)
	delete(add, "fujian")
	fmt.Println("delete 之后:", add)
	fmt.Println("map 查找")
	val, ok := add["shanxi"]
	if ok{
		fmt.Println(val ," 存在")
	}else {
		fmt.Println("val 不存在")
	}
}

Map遍历

使用for-range遍历,map嵌套的话,第一个map的val就是内嵌map,下面介绍嵌套map遍历。

func main() {
	var maps map[string] map[string]string
	maps = make(map[string] map[string]string)
	maps["person1"] = make(map[string]string)
	maps["person1"]["name"] = "wurui"
	maps["person1"]["age"] = "23"
	maps["person1"]["address"] = "baoji"
	maps["person2"] = make(map[string]string)
	maps["person2"]["name"] = "leo"
	maps["person2"]["age"] = "23"
	maps["person2"]["address"] = "xian"
	for k1, v1 := range maps{
		for k2, v2 := range v1{
			fmt.Println(k1," : ", k2, ":", v2)
		}
		fmt.Println("-------------------------")
	}
}

Map和切片一起使用

场景:创建一个[]map[type]type类型的切片,但是每个map元素还是需要进行make。

package main

import "fmt"

func main() {
	var monster []map[string]string
	monster = make([]map[string]string, 2, 5)
	monster[0] = make(map[string]string, 2)
	monster[0]["name"] = "牛魔王"
	monster[0]["age"] = "153"

	monster[1] = make(map[string]string, 2)
	monster[1]["name"] = "白骨精"
	monster[1]["age"] = "123"

	fmt.Println(monster)

	pig := make(map[string]string, 2)
	pig["name"] = "猪八戒"
	pig["age"] = "235"

	// 切片append添加元素
	monster = append(monster, pig)
	fmt.Println(monster)
}

Map小场景

描述:在一个小系统修改密码为88888888,首先判断有无当前用户,如果没有添加用户,设置初始密码88888888

package main

import "fmt"

func main() {
	user := make(map[string]map[string]string)
	user["join"] = make(map[string]string)
	user["join"]["pwd"] = "dsds"
	user["join"]["nickName"] = "fsa"
	fmt.Println(user)
	modifyUser(user, "tom")
	modifyUser(user, "join")
	fmt.Println(user)
}

func modifyUser(user map[string]map[string]string, name string){
	if user["name"] != nil{
		user[name]["pwd"] = "8888888"
	}else {
		// 没有这个用户
		user[name] = make(map[string]string)
		user[name]["pwd"] = "8888888"
		user[name]["nickName"] = "NickName:" + name
	}
}

如果文章内容有错误,还请大佬们指导,防止误人子弟。继续冲冲冲!

 类似资料: