GO学习之 Map 操作

GO系列

1、GO学习之Hello World
2、GO学习之入门语法
3、GO学习之切片操作
4、GO学习之 Map 操作
5、GO学习之 结构体 操作
6、GO学习之 通道(Channel)
7、GO学习之 多线程(goroutine)
8、GO学习之 函数(Function)
9、GO学习之 接口(Interface)
10、GO学习之 网络通信(Net/Http)
11、GO学习之 微框架(Gin)
12、GO学习之 数据库(mysql)
13、GO学习之 数据库(Redis)
14、GO学习之 搜索引擎(ElasticSearch)
15、GO学习之 消息队列(Kafka)
16、GO学习之 远程过程调用(RPC)
17、GO学习之 goroutine的调度原理
18、GO学习之 通道(nil Channel妙用)
19、GO学习之 同步操作sync包
20、GO学习之 互斥锁、读写锁该如何取舍
21、GO学习之 条件变量 sync.Cond
22、GO学习之 单例模式 sync.Once
23、GO 面试题总结一【面试官这样问】

前言

按照公司目前的任务,go 学习是必经之路了,虽然行业卷,不过技多不压身,依旧努力!!!
前面学习了切片操作,对切片有了基本的认识,还有一些基础操作的认识,发现还是和 JAVA 的 List操作有很大区别,今天来认识一下Map以及如何操作的。

一、什么是Map

首先,什么是 Map 呢?就是一种无序的以 key-value 键值对方式存储的数据结构,在 Go 语言中,Map也一样,类似于哈希或者字典,是引用类型,所以必须初始化才能使用,适用于快速查找和存储键值对的场景。
Map 是一种引用类型,需要 make() 函数来创建, 这样来定义 map[键类型]值类型,例如 map[string]int 表示键为字符串类型,值为整数类型的 map。

  • 创建一个空的 map: myMap := make(map[string]int)
  • 使用 map 的名称来添加或修改对于的值,myMap[“a”] = “100”
  • 使用 map 的名称来获取对应的值,value := myMap[“a”]
  • 使用 delete() 函数来删除 map 中的键值对, delete(myMap, “a”)
  • 使用 “for range” 来循环遍历 map 中的键值对, for key, value := range myMap{}
  • 使用 len() 函数获取 map 中键值对的数量, length := len(myMap),需要注意的是,map 中键必须是支持相等操作的类型,比如 整数、字符串、浮点数、指针、数组、结构体等,而值可以是任何类型;另外 map 是无须的结构,遍历 map 的顺序是不确定的。

二、Map的基本操作

2.1 定义map

下面的示例中,定义了一个 map 类型的变量 myMap,从运行结果可以看出,定义的 map 是空的。
可以在什么的时候指定容量,这样就不会导致容量不够扩容而消耗性能了。
也可以在声明的时候初始化值,有时候在开发中需要定义一个字段来使用。

package main

import "fmt"

func main() {
	// 定义一个空的map
	emptyMap := make(map[string]int)
	// 可以指定map的容量,也可以不指定
	myMap := make(map[string]int, 8)
	// 往 myMap 中添加值
	myMap["a"] = 1
	myMap["b"] = 2
	myMap["c"] = 3
	fmt.Println(myMap)
	// 声明的时候添加元素
	dictMap := map[string]string{
		"001": "男",
		"002": "女",
		"003": "未知",
	}
	fmt.Println(dictMap)
}

运行结果:

PS D:\workspaceGo> go run map.go
map[]
map[a:1 b:2 c:3]
map[001:男 002:女 003:未知]

2.2 添加和修改键值对

package main

import "fmt"

func main() {
	myMap := make(map[string]int)
	// 往 myMap 中添加值
	myMap["a"] = 1
	myMap["b"] = 2
	myMap["c"] = 3
	myMap["d"] = 4
	myMap["e"] = 5
	fmt.Println("修改后的map: ", myMap)
	// 修改 map 中的值
	myMap["e"] = 500
	fmt.Println("修改后的map: ", myMap)
}

运行结果:

PS D:\workspaceGo> go run map.go
修改后的map:  map[a:1 b:2 c:3 d:4 e:5]
修改后的map:  map[a:1 b:2 c:3 d:4 e:500]

2.3 删除键值对

package main

import "fmt"

func main() {
	myMap := make(map[string]int)
	// 往 myMap 中添加值
	myMap["a"] = 1
	myMap["b"] = 2
	myMap["c"] = 3
	myMap["d"] = 4
	myMap["e"] = 5
	fmt.Println("删除后的map: ", myMap)
	// 删除 map 中的值
	delete(myMap, "a")
	delete(myMap, "e")
	fmt.Println("删除后的map: ", myMap)
}

运行结果:

PS D:\workspaceGo> go run map.go
删除后的map:  map[a:1 b:2 c:3 d:4 e:5]
删除后的map:  map[b:2 c:3 d:4]

2.4 遍历键值对

  • 基本的遍历
package main

import "fmt"

func main() {
	myMap := make(map[string]int)
	// 往 myMap 中添加值
	myMap["a"] = 1
	myMap["b"] = 2
	myMap["c"] = 3
	myMap["d"] = 4
	myMap["e"] = 5
	length := len(myMap)
	fmt.Println("map的长度:", length)
	// 遍历 map
	for key, value := range myMap {
		fmt.Println("key: ", key, ", value: ", value)
	}
}

运行结果:

PS D:\workspaceGo> go run map.go
map的长度: 5
key:  a , value:  1
key:  b , value:  2
key:  c , value:  3
key:  d , value:  4
key:  e , value:  5
PS D:\workspaceGo> go run map.go
map的长度: 5
key:  e , value:  5
key:  a , value:  1
key:  b , value:  2
key:  c , value:  3
key:  d , value:  4

:这里我执行了两次,可以看出两次遍历打印出来的顺序都会不一样的,所以 map 是无须的键值对数据结构。

  • 忽略键或者值的写法
	// 只需要值,不需要 key
	for _, v := range myMap {
		fmt.Println("值为:", v)
	}
	for k, _ := range myMap {
		fmt.Println("键为:", k)
	}
  • 顺序遍历 map
    ...声明 myMap 代码省略,同上
	//声明切片用来存放 kay
	keys := []string{}
	for key := range myMap {
		keys = append(keys, key)
	}
	//对切片进行排序
	sort.Strings(keys)
	//遍历切片来获取 map 元素
	for _, k := range keys {
		fmt.Println(k, myMap[k])
	}

运行结果:

a 1
b 2
c 3
d 4
e 5

2.5 判断某个key是否存在

package main

import "fmt"

func main() {
	myMap := make(map[string]int, 8)
	// 往 myMap 中添加值
	myMap["a"] = 1
	myMap["b"] = 2
	myMap["c"] = 3
	value, ok := myMap["d"]
	if ok {
		fmt.Println(value)
	} else {
		fmt.Println("没有这个键")
	}

	v, exists := myMap["a"]
	if exists {
		fmt.Println("a 的值为:", v)
	} else {
		fmt.Println("没有a")
	}
}

运行结果:

PS D:\workspaceGo> go run map.go
没有这个键
a 的值为: 1

三、总结

其实 map 还是比较容易上手的,初始化和操作都比较容易的。
我主张每篇博客都不要长篇大论,这样有需要的人也能很容易检索到想要的结果,自己在后面复习巩固的时候也不会看自己的博客疲劳。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值