map 简单梳理【GO 基础】

map,简单,梳理,go,基础 · 浏览次数 : 3

小编点评

**Map 简介** **定义:** ```go map[KeyType]ValueType ``` 其中: * `KeyType`:键的类型 * `ValueType`:键对应的值类型 **基本使用:** ```go // 创建一个包含字符串 "张三" 和整数 90 的映射 scoreMap := make(map[string]int, 2) scoreMap["张三"] = 90 // 打印映射中 "张三" 的值 fmt.Println(scoreMap["张三"]) // 输出 90 ``` **判断键是否存在:** ```go // 获取映射中键 "张三" 的值 value, ok := scoreMap["张三"] // 打印值和布尔值 fmt.Println(value, ok) // 输出 90 和 true ``` **遍历 map:** ```go // 创建一个包含字符串 "张三"、整数 90 和字符串 "王五" 的映射 scoreMap := make(map[string]int, 3) // 遍历 map,并打印键值对 for k, v := range scoreMap { fmt.Println(k, v) } ``` **删除键值对:** ```go // 从映射中删除键 "李四" 的值 delete(scoreMap, "李四") // 打印映射 fmt.Println(scoreMap) // 输出 { "张三": 90 } ``` **按照顺序遍历 map:** ```go // 创建一个包含字符串 "张三"、整数 90 和字符串 "王五" 的映射 scoreMap := make(map[string]int, 3) // 获取所有 key 并排序 keys := make([]string, 0, 200) for key := range scoreMap { keys = append(keys, key) } sort.Strings(keys) // 遍历排序后的 key,并打印键值对 for _, key := range keys { fmt.Println(key, scoreMap[key]) } ``` **其他用法:** * 使用 `delete()` 内建函数删除键值对。 * 使用 `for range` 遍历切片中的 map 元素。 * 将所有 key 从切片中提取并存储在一个新的 map 中。

正文

〇、map 简介

map 是一种无序的基于 key-value 的数据结构,Go 语言中的 map 是引用类型,必须初始化才能使用。

其中键可以是任何类型,但值必须是可比较的类型(如整数、字符串、布尔值等)。

一、map 的定义和使用

1.1 map 的定义

map[KeyType]ValueType
// KeyType:表示键的类型
// ValueType:表示键对应的值的类型

map 类型的变量默认初始值为 nil,需要使用 make() 函数来分配内存。语法为:

make(map[KeyType]ValueType, [cap])
// cap:表示 map 的容量,非必须

1.2 map 的基本使用

map 中的数据都是成对出现的,map 的基本使用示例代码如下:

package main

import "fmt"

func main() {
	scoreMap := make(map[string]int, 8)
	scoreMap["张三"] = 90
	scoreMap["李四"] = 100
	fmt.Println(scoreMap)
	fmt.Println(scoreMap["李四"])
	fmt.Printf("type of scoreMap : %T\n", scoreMap)
	// 声明时直接赋值
	userInfo := map[string]bool{
		"王五": true,
	}
	fmt.Println(userInfo)
	fmt.Printf("type of userInfo : %T\n", userInfo)
}

1.3 判断某个键是否存在

Go 语言中有个判断 map 中键是否存在的特殊写法,格式如下:

value, ok := map[key]
// 若 key 存在,则 ok = true,value 为对应的值,否则 ok = false
package main

import "fmt"

func main() {
	scoreMap := make(map[string]int)
	scoreMap["张三"] = 90
	scoreMap["小明"] = 100
	value, ok := scoreMap["张三"]
	if ok {
		fmt.Println(value)
	} else {
		fmt.Println("查无此人")
	}
	value2, ok := scoreMap["张三1"]
	if ok {
		fmt.Println(value2)
	} else {
		fmt.Println("查无此人")
	}
}

1.4 map 的遍历

Go 语言中使用 for range 遍历 map。

package main

import "fmt"

func main() {
	scoreMap := make(map[string]int)
	scoreMap["张三"] = 90
	scoreMap["李四"] = 100
	scoreMap["王五"] = 60
	for k, v := range scoreMap { // 只想遍历 k 时,v 可省略
		fmt.Println(k, v)
	}
}

注意:遍历 map 时的元素顺序与添加键值对的顺序无关。

1.5 通过 delete 删除键值对

使用 delete() 内建函数从 map 中删除一组键值对,delete() 函数的格式如下:

delete(map, key)
// map 表示要从中删除键值对的 map 对象名
// key 表示要删除的键
package main

import "fmt"

func main() {
	scoreMap := make(map[string]int)
	scoreMap["张三"] = 90
	scoreMap["李四"] = 100
	scoreMap["王五"] = 60
	delete(scoreMap, "李四")
	for k, v := range scoreMap {
		fmt.Println(k, v)
	}
}

1.6 按照指定顺序遍历 map

map 本身是无序的,如果想按照顺序来遍历,可以将全部的 key 取出来自行排序,最后对这个排序后的键列表进行遍历,每次通过键取 map 中的值。如下示例代码:

package main

import (
	"fmt"
	"math/rand"
	"sort"
)

func main() {
	var scoreMap = make(map[string]int, 20)
	for i := 0; i < 10; i++ {
		key := fmt.Sprintf("stu%02d", i) // 生成 stu 开头的字符串
		value := rand.Intn(100)          // 生成 0~99 的随机整数
		scoreMap[key] = value
	}
	// 取出 map 中的所有 key 存入切片 keys
	var keys = make([]string, 0, 200)
	for key := range scoreMap {
		keys = append(keys, key)
	}
	// 对切片进行排序
	sort.Strings(keys)
	// 按照排序后的 key 遍历 map
	for _, key := range keys {
		fmt.Println(key, scoreMap[key])
	}
}

1.7 元素可以是 map 类型的切片

package main

import (
	"fmt"
)

func main() {
	var mapSlice = make([]map[string]string, 3) // 初始化一个 map 列表,长度为 3 的
	for index, value := range mapSlice {
		fmt.Printf("index:%d value:%v\n", index, value)
	}

	fmt.Println("after init")
	// 对切片中的 map 元素进行初始化
	mapSlice[0] = make(map[string]string, 10) // 初始化第一个切片的值为长度是 10 的 map,然后后续再进行赋值
	mapSlice[0]["name"] = "王五"
	mapSlice[0]["password"] = "123456"
	mapSlice[0]["address"] = "红旗大街"
	for index, value := range mapSlice {
		fmt.Printf("index:%d value:%v\n", index, value)
	}
}

1.8 值为切片类型的 map

package main

import (
	"fmt"
)

func main() {
	var sliceMap = make(map[string][]string, 3) // 初始化一个长度为 3 的 map
	fmt.Println(sliceMap)
	fmt.Println("after init")
	key := "中国"
	value, ok := sliceMap[key]
	if !ok {
		value = make([]string, 0, 2)
	}
	value = append(value, "北京", "上海") // 往 value 中添加值
	sliceMap[key] = value
	fmt.Println(sliceMap)
}

参考:http://www.topgoer.com/go%E5%9F%BA%E7%A1%80/Map.html

与map 简单梳理【GO 基础】相似的内容:

map 简单梳理【GO 基础】

map 是一种无序的基于 key-value 的数据结构,Go 语言中的 map 是引用类型,必须初始化才能使用。比较容易混淆,本文来梳理下。

C++ STL 容器简单讲解

STL 简单讲解 网上有很多很好的资料可以参考 而直接看标准是最准确清晰的 vector stack queue / priority_queue deque array map / multimap set / multiset unordered_map unordered_set 关于指针和迭

overcommit_memory的简单学习

overcommit_memory的简单学习 背景 前几天一个测试环境启动失败. 总是有如下的提示: Native memory allocation (mmap) failed to map 12288 bytes for committing reserved memory. 当时看free 其

还在stream中使用peek?不要被这些陷阱绊住了

简介 自从JDK中引入了stream之后,仿佛一切都变得很简单,根据stream提供的各种方法,如map,peek,flatmap等等,让我们的编程变得更美好。 事实上,我也经常在项目中看到有些小伙伴会经常使用peek来进行一些业务逻辑处理。 那么既然JDK文档中说peek方法主要是在调试的情况下使

Java并发Map的面试指南:线程安全数据结构的奥秘

简介 在计算机软件开发的世界里,多线程编程是一个重要且令人兴奋的领域。然而,与其引人入胜的潜力相伴而来的是复杂性和挑战,其中之一就是处理共享数据。当多个线程同时访问和修改共享数据时,很容易出现各种问题,如竞态条件和数据不一致性。 本文将探讨如何在Java中有效地应对这些挑战,介绍一种强大的工具——并

4.go语言复合类型简述

[TOC] # 1. 本章前瞻 很好,经过很长的时间,你终于来到go语言的复合类型中,这里会介绍go语言的3种复合结构:切片(slice,可变数组),映射(map)和字符串(string)。 有些老手可能会问: 1.那结构体(struct)呢,你怎么不介绍? 答:现在还没法完整地介绍结构体(stru

[转帖]pmap内存分析工具

https://www.cnblogs.com/zh-dream/p/14848344.html 简介 pmap - report memory map of a process 进程的内存映射报告 语法: pmap [options] pid [...] 选项 选项 含义 -x 显示扩展的信息 -

[转帖]Linux性能优化(四)——BCC性能监控工具

一、BCC简介 1、BCC简介 BCC是一个Python库,简化了eBPF应用的开发过程,并收集了大量性能分析相关的eBPF应用。BCC为BPF开发提供了不同的前端支持,包括Python和Lua,实现了map创建、代码编译、解析、注入等操作,使开发人员只需聚焦于用C语言开发要注入的内核代码。 BCC

[转帖]python 性能优化监控工具_Linux性能优化(四)——BCC性能监控工具

一、BCC简介 1、BCC简介 BCC是一个Python库,简化了eBPF应用的开发过程,并收集了大量性能分析相关的eBPF应用。BCC为BPF开发提供了不同的前端支持,包括Python和Lua,实现了map创建、代码编译、解析、注入等操作,使开发人员只需聚焦于用C语言开发要注入的内核代码。 BCC

【转帖】Linux性能优化(四)——BCC性能监控工具

一、BCC简介 1、BCC简介 BCC是一个Python库,简化了eBPF应用的开发过程,并收集了大量性能分析相关的eBPF应用。BCC为BPF开发提供了不同的前端支持,包括Python和Lua,实现了map创建、代码编译、解析、注入等操作,使开发人员只需聚焦于用C语言开发要注入的内核代码。 BCC