【GO语言卵细胞级别教程】10.探索Go语言中神奇的Map类型:解密键值对的魔力(含习题)

【GO语言卵细胞级别教程】10.探索Go语言中神奇的Map类型:解密键值对的魔力(含习题)

文章目录

🥰微信公众号:【给点知识】分享小知识,快速成长,欢迎关注呀!(底部点击二维码)

🥰本项目演示代码仓库:https://gitee.com/gdzsfun/csdn-study-go 演示项目仓库

🥰本项目创建方式:【GO语言卵细胞级别教程】05.项目创建和函数讲解

🥰学习宗旨:活到老,学到老。

😍写作宗旨:致力于改变现有文章难读难懂问题。

1.简介

map就是类似python中的字典,是一对键值对key-value。

例如:

学生1:学号1

学生2:学号2

GO 复制代码
{
	"name":"张三",
	"age":"19"
}
  1. 注意事项
    (1)key value的类型 bool 数组 指针 channel、结构体、接口、数组
    (2)key通常是为int string value通常为 map int float string 结构体
    (3)key 不能为 slice map function
    (4)map排序是乱序的
    (5)使用之前一定要使用make申请空间
    (6)key不能重复,后面的会把前面已经赋值的给覆盖了
    (7)使用make(map, size)初始的时候,size可以省略默认为1

2. 基本语法

  1. 定义映射类型使用make(map, size)
go 复制代码
// 语法
var mapName map[keyType]valueType
// 举例
var map1 map[int]string
map1 = make(map[int]string)

// 例子
var a map[int]string
a = make(map[int]string, 1)
a[100] = "中国"
a[99] = "美国"
a[98] = "印度"
fmt.Println(a)
// 输出结果
map[98:印度 99:美国 100:中国]
  1. makei不加长度make(map)
go 复制代码
var map2 map[int]string
map2 = make(map[int]string)
// 或者
map2 := make(map[int]string)
map2[100] = "中国"
  1. 直接赋值
go 复制代码
// 使用显示定义
var map2 map[int]string = map[int]string{
	123:"123",
}
fmt.Println(map2)
// 使用隐式定义
map3 := map[int]string{
	345:"345",
}
fmt.Println(map3)
// 输出结果
map[123:123]
-----
map[345:345]
  1. 多级映射
go 复制代码
var selfInfoMap map[string]map[string]string
selfInfoMap =  make(map[string]map[string]string)
selfInfoMap["student1"] = make(map[string]string)
selfInfoMap["student1"]["name"] = "张三"
selfInfoMap["student1"]["age"] = "19"
selfInfoMap["student1"]["notes"] = "优秀"

实战

go 复制代码
var selfInfoMap map[string]map[string]string
selfInfoMap =  make(map[string]map[string]string)
selfInfoMap["student1"] = make(map[string]string)
selfInfoMap["student1"]["name"] = "张三"
selfInfoMap["student1"]["age"] = "19"
selfInfoMap["student1"]["notes"] = "优秀"

for _,v := range selfInfoMap{
	fmt.Printf("学生:%v, 年龄:%v, 备注:%v\n",
			v["name"],
			v["age"],
			v["notes"])
}
//输出结果
学生:张三, 年龄:19, 备注:优秀

3.Map基本操作

3.1 增删改查

  1. 增加与更新操作
    只用使用mapx[key] = value
    (1)如果key存在则更新,反之增加元素
go 复制代码
package mystudy
// 映射map知识点
import "fmt"

func DemoMap(){
	// map基本操作
	fmt.Println("------map基本操作------")
	map6 := make(map[int]string)
	map6[1] = "111"
	map6[2] = "222"
	fmt.Println(map6)
	// 增加操作
	map6[3] = "333"
	fmt.Println("新增key:3 value", map6[3])
    // 更新操作 
	map6[3] = "3-3-3"
	fmt.Println("修改key:3 value", map6[3])
}
// 输出结果
------map基本操作------
map[1:111 2:222]
新增key:3 value 333
修改key:3 value 3-3-3
  1. 删除操作:delete(map, "key")
go 复制代码
package mystudy
// 映射map知识点
import "fmt"

func DemoMap(){
	// map基本操作
	fmt.Println("------map基本操作------")
	map6 := make(map[int]string)
	map6[1] = "111"
	map6[2] = "222"
	fmt.Println(map6)
	map6[3] = "333"
	fmt.Println("新增key:3 value", map6[3])
	map6[3] = "3-3-3"
	fmt.Println("修改key:3 value", map6[3])
	// 删除操作
	fmt.Println("删除前map6:", map6)
	delete(map6,3)
	fmt.Println("删除后map6:", map6)

}
// 输出结果
删除前map6: map[1:111 2:222 3:3-3-3]
删除后map6: map[1:111 2:222]
  1. 清空数组操作
go 复制代码
1. 清空操作,方式1使用delete遍历删除
2. 使用make赋值新的空间
map6 = make(map[int]string)
  1. 获取值操作map6[2] 会有两个返回值,一个是value 一个是元素是否存在的布尔类型
    true 存在,false 不存在 value对应的类型以及默认值就是 map[int]string 值对应的类型,比如
    map[int]string 值类型是string那么这个字符串就是空的 如果是 map[int]int 那么如果获取不到就默认是0 false
go 复制代码
package mystudy
// 映射map知识点
import "fmt"

func DemoMap(){
	// map基本操作
	fmt.Println("------map基本操作------")
	map6 := make(map[int]int)
	map6[1] = 111
	map6[2] = 222
	fmt.Println(map6)
	// 增加操作
	map6[3] = 333
	fmt.Println("新增key:3 value", map6[3])
    // 更新操作 
	map6[3] = 33333
	fmt.Println("修改key:3 value", map6[3])
	// 删除操作
	fmt.Println("删除前map6:", map6)
	delete(map6,3)
	fmt.Println("删除后map6:", map6)
	// 清空map6
	// map6 = make(map[int]string)
	// fmt.Println(map6)
	// 获取值操作
	value, bool1:= map6[2]
	fmt.Printf("%T, %T\n", value, bool1)
	fmt.Println(value, bool1)
	value, bool1 = map6[22]
	fmt.Printf("%T, %T\n", value, bool1)
	fmt.Println(value, bool1)
}
// 输出结果
------map基本操作------
map[1:111 2:222]
新增key:3 value 333
修改key:3 value 33333
删除前map6: map[1:111 2:222 3:33333]
删除后map6: map[1:111 2:222]
int, bool
222 true
int, bool
0 false

3.2 遍历

  1. 使用for - range进行遍历
go 复制代码
package mystudy
// 映射map知识点
import "fmt"

func DemoMap(){

	// 定义多级映射
	var selfInfoMap map[string]map[string]string
	selfInfoMap =  make(map[string]map[string]string)
	selfInfoMap["student1"] = make(map[string]string)
	selfInfoMap["student1"]["name"] = "张三"
	selfInfoMap["student1"]["age"] = "19"
	selfInfoMap["student1"]["notes"] = "优秀"

	for _,v := range selfInfoMap{
		fmt.Printf("学生:%v, 年龄:%v, 备注:%v\n",
				v["name"],
				v["age"],
				v["notes"])
	}
	
}
// main
学生:张三, 年龄:19, 备注:优秀
  1. 获取map长度,使用len(xxx)

4. 本章的代码

go 复制代码
package mystudy
// 映射map知识点
import "fmt"

func DemoMap(){
	// 定义map变量
	var a map[int]string
	a = make(map[int]string, 1)
	a[100] = "中国"
	a[99] = "美国"
	a[98] = "印度"
	fmt.Println(a)
	fmt.Println("-----")
	var map1 map[int]string
	map1 = make(map[int]string)
	map1[66] = "以色列"
	map1[68] = "巴勒斯坦"
	fmt.Println(map1)
	fmt.Println("------")
	var map2 map[int]string = map[int]string{
		123:"123",
	}
	fmt.Println(map2)
	fmt.Println("-----")
	map3 := map[int]string{
		345:"345",
	}
	fmt.Println(map3)

	fmt.Println("-----")

	// 定义多级映射
	var selfInfoMap map[string]map[string]string
	selfInfoMap =  make(map[string]map[string]string)
	selfInfoMap["student1"] = make(map[string]string)
	selfInfoMap["student1"]["name"] = "张三"
	selfInfoMap["student1"]["age"] = "19"
	selfInfoMap["student1"]["notes"] = "优秀"

	for _,v := range selfInfoMap{
		fmt.Printf("学生:%v, 年龄:%v, 备注:%v\n",
				v["name"],
				v["age"],
				v["notes"])
	}
	// 获取长度
	fmt.Println(len(selfInfoMap))
	// map基本操作
	fmt.Println("------map基本操作------")
	map6 := make(map[int]int)
	map6[1] = 111
	map6[2] = 222
	fmt.Println(map6)
	// 增加操作
	map6[3] = 333
	fmt.Println("新增key:3 value", map6[3])
    // 更新操作 
	map6[3] = 33333
	fmt.Println("修改key:3 value", map6[3])
	// 删除操作
	fmt.Println("删除前map6:", map6)
	delete(map6,3)
	fmt.Println("删除后map6:", map6)
	// 清空map6
	// map6 = make(map[int]string)
	// fmt.Println(map6)
	// 获取值操作
	value, bool1:= map6[2]
	fmt.Printf("%T, %T\n", value, bool1)
	fmt.Println(value, bool1)
	value, bool1 = map6[22]
	fmt.Printf("%T, %T\n", value, bool1)
	fmt.Println(value, bool1)
}
  1. 多嵌套遍历
go 复制代码
package main

import "fmt"

func main() {
	// 创建多个嵌套的映射
	employeeMap := make(map[string]map[string]string)

	// 添加数据到映射中
	employeeMap["John"] = map[string]string{
		"position": "Manager",
		"department": "Sales",
		"city": "New York",
	}

	employeeMap["Alice"] = map[string]string{
		"position": "Engineer",
		"department": "IT",
		"city": "San Francisco",
	}

	employeeMap["Bob"] = map[string]string{
		"position": "Analyst",
		"department": "Finance",
		"city": "Chicago",
	}

	// 遍历多个嵌套的映射
	for name, details := range employeeMap {
		fmt.Printf("Employee: %s\n", name)
		fmt.Println("Details:")
		for key, value := range details {
			fmt.Printf("%s: %s\n", key, value)
		}
		fmt.Println()
	}
}

5.练习题

当提供一些Go语言的映射(Map)练习题,包括选择题和算法题。以下是几个例子及其答案:

选择题:

  1. 下面哪个选项是创建一个空映射的正确方式?

    a) var m map[string]int

    b) m := make(map[string]int)

    c) m := map[string]int{}

    d) m := new(map[string]int)

    答案:b) m := make(map[string]int)

  2. 假设有一个映射m,如何判断键"key1"是否存在于映射中?

    a) if m["key1"] != nil

    b) if _, ok := m["key1"]; ok

    c) if m["key1"] != ""

    d) if _, ok := m["key1"]

    答案:b) if _, ok := m["key1"]; ok

算法题:

  1. 给定一个字符串,统计每个字符出现的次数,并将结果存储在一个映射中。
go 复制代码
func countCharacters(str string) map[rune]int {
    charCount := make(map[rune]int)
    for _, char := range str {
        charCount[char]++
    }
    return charCount
}

func main() {
    str := "abracadabra"
    result := countCharacters(str)
    fmt.Println(result)
}

输出结果:

map[a:4 b:2 r:2 c:1 d:1]
  1. 给定两个映射m1m2,编写一个函数判断它们是否相等,即包含相同的键和对应的值。
go 复制代码
func mapsEqual(m1, m2 map[string]int) bool {
    if len(m1) != len(m2) {
        return false
    }
    for key, val := range m1 {
        if m2Val, ok := m2[key]; !ok || m2Val != val {
            return false
        }
    }
    return true
}

func main() {
    m1 := map[string]int{"a": 1, "b": 2, "c": 3}
    m2 := map[string]int{"a": 1, "b": 2, "c": 3}
    fmt.Println(mapsEqual(m1, m2)) // true
    
    m3 := map[string]int{"a": 1, "b": 2, "c": 3}
    m4 := map[string]int{"a": 1, "b": 3, "c": 3}
    fmt.Println(mapsEqual(m3, m4)) // false
}

输出结果:

true
false
相关推荐
杜杜的man3 小时前
【go从零单排】go中的结构体struct和method
开发语言·后端·golang
幼儿园老大*3 小时前
走进 Go 语言基础语法
开发语言·后端·学习·golang·go
半桶水专家3 小时前
go语言中package详解
开发语言·golang·xcode
llllinuuu3 小时前
Go语言结构体、方法与接口
开发语言·后端·golang
cookies_s_s3 小时前
Golang--协程和管道
开发语言·后端·golang
王大锤43913 小时前
golang通用后台管理系统07(后台与若依前端对接)
开发语言·前端·golang
产幻少年3 小时前
golang函数
golang
为什么这亚子3 小时前
九、Go语言快速入门之map
运维·开发语言·后端·算法·云原生·golang·云计算
半桶水专家3 小时前
用go实现创建WebSocket服务器
服务器·websocket·golang
材料苦逼不会梦到计算机白富美3 小时前
golang分布式缓存项目 Day 1
分布式·缓存·golang