【入门】Go语言Map集合详解

一、Map集合介绍

1.1 什么是Map集合?

  • map集合是一种无序的键值对的集合
  • map是通过key来快速检索数据,key类似于索引,指向数据的值
  • 在获取 Map 的值时,如果键不存在,返回该类型的零值,例如 int 类型的零值是 0,string 类型的零值是 ""
  • Map 是引用类型,如果将一个 Map 传递给一个函数或赋值给另一个变量,它们都指向同一个底层数据结构,因此对 Map 的修改会影响到所有引用它的变量

Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map 是无序的,我们无法决定它的返回顺序,这是因为 Map 是使用 hash 表来实现的。

1.2 Map集合语法

mapVariable := make(map[KeyType]ValueType, initialCapacity)
  • KeyType 是键的类型
  • ValueType 是值的类型
  • initialCapacity 是可选的参数,用于指定 Map 的初始容量

二、Map基本操作

2.1 定义Map

package main

import "fmt"

func main() {
  // 定义一个空Map
	siteMap := make(map[string]string)
	fmt.Println(siteMap)
}

或者可以使用下面方法定义并初始化:

package main

import "fmt"

func main() {

	siteMap := map[string]int{
		"zhangsan": 1,
		"lisi":     2,
		"wangwu":   3,
	}
	fmt.Println(siteMap)
}

2.2 获取Map

如果键是存在的,"变量1"中存储对应的值,"变量2"的值为true,false。

package main

import "fmt"

func main() {

	siteMap := map[string]int{
		"zhangsan": 1666,
		"lisi":     2666,
		"wangwu":   3,
	}

	v1 := siteMap["zhangsan"] //将zhangsan键的值付给v1变量
	v2, ok := siteMap["lisi"] //将lisi键值付给v1,ok两个变量
	fmt.Println(v1)
	fmt.Println(v2, ok)
}

代码输出内容:

1666
2666 true

2.3 修改Map元素

package main

import "fmt"

func main() {

	siteMap := map[string]int{
		"zhangsan": 1666,
		"lisi":     2666,
		"wangwu":   3,
	}
	siteMap["lisi"] = 666666 // 修改元素
	fmt.Println(siteMap["lisi"])
}

代码输出内容:

666666

2.4 删除Map元素

package main

import "fmt"

func main() {

	siteMap := map[string]int{
		"zhangsan": 1666,
		"lisi":     2666,
		"wangwu":   3,
	}
	delete(siteMap, "zhangsan") // 删除元素

	fmt.Println(siteMap)
}

代码输出内容:

map[lisi:2666 wangwu:3]

2.5 遍历Map

package main

import "fmt"

func main() {

	siteMap := map[string]int{
		"zhangsan": 1666,
		"lisi":     2666,
		"wangwu":   3,
	}
	for i, v := range siteMap {
		fmt.Printf("键:%v\t\t值:%v\n", i, v)
	}
}

代码输出内容:

键:zhangsan			值:1666
键:lisi			值:2666
键:wangwu			值:3

三、拓展

3.1 map作为函数参数

package main

import (
	"fmt"
)

func main() {
	m := map[string]int{"zhangsan": 17, "lisi": 18, "wangwu": 19, "maliu": 20}
	PrintMap(m)
	DeleteMap(m)
	fmt.Println("=====================================")
	PrintMap(m)
}

func PrintMap(m map[string]int) {
	for i, k := range m {
		fmt.Printf("key:%v\tvalue:%v\n", i, k)
	}
}

func DeleteMap(m map[string]int) {
	delete(m, "zhangsan")
}

代码输出内容:

key:zhangsan	value:17
key:lisi	value:18
key:wangwu	value:19
key:maliu	value:20
=====================================
key:lisi	value:18
key:wangwu	value:19
key:maliu	value:20

3.2 案例一

package main

import (
	"fmt"
)

func main() {
	cities := make(map[string]string)
	// 新增key
	cities["no1"] = "北京"
	cities["no2"] = "上海"
	cities["no3"] = "深圳"

	// 修改key,因为这个存在,索引是修改
	cities["no3"] = "邯郸"

	// 删除key
	delete(cities, "no2")
	fmt.Println(cities)

	// 删除所有key 直接make一个新地址
	cities = make(map[string]string)
	fmt.Println(cities)
}

代码输出内容:

map[no1:北京 no3:邯郸]
map[]

3.3 案例二

package main

import "fmt"

func main() {
	siteMap := make(map[string]string)

	siteMap["A"] = "石家庄"
	siteMap["B"] = "唐山"
	siteMap["C"] = "秦皇岛"
	siteMap["D"] = "邯郸"

	for site := range siteMap {
		fmt.Printf("车牌 %v 城市是: %v\n", site, siteMap[site])
	}

	name, ok := siteMap["D"]
	if ok {
		fmt.Println("D对应城市是:", name)
	} else {
		fmt.Println("D 没有定义!")
	}
}

代码输出内容:

车牌 C 城市是: 秦皇岛
车牌 D 城市是: 邯郸
车牌 A 城市是: 石家庄
车牌 B 城市是: 唐山
D对应城市是: 邯郸

3.4 案例三

统计一个字符串中字母出现的次数

package main

import (
	"fmt"
)

func main() {
	var str string = "qinqinziteng666"
	m := make(map[byte]int)
	for i := 0; i < len(str); i++ {
		ch := str[i]
		m[ch] = m[ch] + 1 //int类型默认值是0
	}

	for i, v := range m {
		fmt.Printf("%c出现了\t%d次\n", i, v)
	}
}

代码输出内容:

e出现了	1次
g出现了	1次
6出现了	3次
q出现了	2次
i出现了	3次
n出现了	3次
z出现了	1次
t出现了	1次
posted @ 2023-03-30 17:18  乱七八糟博客备份  阅读(57)  评论(0编辑  收藏  举报