Go语言学习笔记(六)------Map

python补充基础知识 python基础的补充,记录各种函数方便查询 阅读详情

一、声明、初始化和 make

1.map 是一种特殊的数据结构:一种元素对(pair)的无序集合,pair 的一个元素是 key,对应的另一个元素是 value,所以这个结构也称为关联数组或字典。这是一种快速寻找值的理想结构:给定 key,对应的 value 可以迅速定位。

2.map 是引用类型,可以使用如下声明:var map1 map[keytype]valuetype ,例如:var map1 map[string]int,在声明的时候不需要知道 map 的长度,map 是可以动态增长的,未初始化的 map 的值是 nil,key1 对应的值通过赋值符号来设置为 val1: map1[key1] = val1 。

3.key 可以是任意可以用 == 或者 != 操作符比较的类型,比如 string、int、float。所以数组、切片和结构体不能作为 key(含有数组切片的结构体不能作为 key,只包含内建类型的 struct 是可以作为 key 的),但是指针和接口类型可以。如果要用结构体作为 key 可以提供 Key() 和 Hash() 方法,这样可以通过结构体的域计算出唯一的数字或者字符串的 key。value 可以是任意类型的;通过使用空接口类型,我们可以存储任意值,但是使用这种类型作为值时需要先做一次类型断言。

4.常用的 len(map1) 方法可以获得 map 中的 pair 数目,这个数目是可以伸缩的,因为 map-pairs 在运行时可以动态添加和删除。

5.mapLit 说明了 map literals 的使用方法: map 可以用 {key1: val1, key2: val2} 的描述方法来初始化,就像数组和结构体一样。map 是 引用类型 的: 内存用 make 方法来分配。map 的初始化: var map1 = make(map[keytype]valuetype) 。或者简写为: map1 := make(map[keytype]valuetype) 。例子中的 mapCreated 就是用这种方式创建的: mapCreated := make(map[string]float32) 。相当于: mapCreated := map[string]float32{} 。mapAssigned 也是 mapList 的引用,对 mapAssigned 的修改也会影响到 mapLit 的值。不要使用 new,永远用 make 来构造 map。

package main
import "fmt"
func main() {
	var mapLit map[string]int
	//var mapCreated map[string]float32
	var mapAssigned map[string]int
	mapLit = map[string]int{"one": 1, "two": 2}
	mapCreated := make(map[string]float32)
	mapAssigned = mapLit
	mapCreated["key1"] = 4.5
	mapCreated["key2"] = 3.14159
	mapAssigned["two"] = 3
	fmt.Printf("Map literal at \"one\" is: %d\n", mapLit["one"])
	fmt.Printf("Map created at \"key2\" is: %f\n", mapCreated["key2"])
	fmt.Printf("Map assigned at \"two\" is: %d\n", mapLit["two"])
	fmt.Printf("Map literal at \"ten\" is: %d\n", mapLit["ten"])
}

6.值可以是任意类型的,这里给出了一个使用 func() int 作为值的 map,输出结果为: map[1:0x10903be0 5:0x10903ba0 2:0x10903bc0] : 整形都被映射到函数地址。

package main
import "fmt"
func main() {
mf := map[int]func() int{
1: func() int { return 10 },
2: func() int { return 20 },
5: func() int { return 50 },
}
fmt.Println(mf)
}

7.和数组不同,map 可以根据新增的 key-value 对动态的伸缩,因此它不存在固定长度或者最大限制。但是你也可以选择标明 map 的初始容量 capacity ,就像这样: make(map[keytype]valuetype, cap) 。例如:

map2 := make(map[string]float32, 100)

当 map 增长到容量上限的时候,如果再增加新的 key-value 对,map 的大小会自动加 1。

8.用切片作为 map 的值,一个 key 要对应多个值怎么办?例如,当我们要处理unix机器上的所有进程,以父进程(pid 为整形)作为key,所有的子进程(以所有子进程的 pid 组成的切片)作为 value。通过将 value 定义为 []int 类型或者其他类型的切片,就可以优雅的解决这个问题。这里有一些定义这种 map 的例子:

mp1 := make(map[int][]int)
mp2 := make(map[int]*[]int)

二、测试键值对是否存在及删除元素

1.val1, isPresent = map1[key1],isPresent 返回一个 bool 值:如果 key1 存在于 map1,val1 就是 key1 对应的 value 值,并且 isPresent为true;如果 key1 不存在,val1 就是一个空值,并且 isPresent 会返回 false。你只是想判断某个 key 是否存在而不关心它对应的值到底是多少,你可以这么做:

_, ok := map1[key1] // 如果key1存在则ok == true,否则ok为false

或者和 if 混合使用:

if _, ok := map1[key1]; ok {
// ...
}

2.map1 中删除 key1:直接 delete(map1, key1) 就可以。如果 key1 不存在,该操作不会产生错误。

package main
import "fmt"
func main() {
	var value int
	var isPresent bool
	map1 := make(map[string]int)
	map1["New Delhi"] = 55
	map1["Beijing"] = 20
	map1["Washington"] = 25
	value, isPresent = map1["Beijing"]
	if isPresent {
		fmt.Printf("The value of \"Beijing\" in map1 is: %d\n", value)
	} else {
		fmt.Printf("map1 does not contain Beijing")
	}
	value, isPresent = map1["Paris"]
	fmt.Printf("Is \"Paris\" in map1 ?: %t\n", isPresent)
	fmt.Printf("Value is: %d\n", value)
	// delete an item:
	delete(map1, "Washington")
	value, isPresent = map1["Washington"]
	if isPresent {
		fmt.Printf("The value of \"Washington\" in map1 is: %d\n", value)
	} else {
		fmt.Println("map1 does not contain Washington")
	}
}

三、for-range 的配套用法

以使用 for 循环构造 map:

for key, value := range map1 {
...
}

第一个返回值 key 是 map 中的 key 值,第二个返回值则是该 key 对应的 value 值;这两个都是仅 for 循环内部可见的局部变量。其中第一个返回值key值是一个可选元素。如果你只关心值,可以这么使用:

for _, value := range map1 {
...
}

如果只想获取 key,你可以这么使用:

for key := range map1 {
fmt.Printf("key is: %d\n", key)
}

四、map 类型的切片

获取一个 map 类型的切片,我们必须使用两次 make() 函数,第一次分配切片,第二次分配 切片中每个map 元素。应当像 A 版本那样通过索引使用切片的 map 元素。在 B 版本中获得的项只是 map 值的一个拷贝而已,所以真正的 map 元素没有得到初始化。

package main
import "fmt"
func main() {
// Version A:
items := make([]map[int]int, 5) //标明切片容量5
for i:= range items {
items[i] = make(map[int]int, 1) //标明 map 的每次容量1
items[i][1] = 2 //每一个索引赋值1,2
}
fmt.Printf("Version A: Value of items: %v\n", items)
// Version B: NOT GOOD!
items2 := make([]map[int]int, 5)
for _, item := range items2 {
item = make(map[int]int, 1) // item is only a copy of the slice element.
item[1] = 2 // This 'item' will be lost on the next iteration.
}
fmt.Printf("Version B: Value of items: %v\n", items2)
}

输出结果:

Version A: Value of items: [map[1:2] map[1:2] map[1:2] map[1:2] map[1:2]]
Version B: Value of items: [map[] map[] map[] map[] map[]]

五、map 的排序

map 默认是无序的,不管是按照 key 还是按照 value 默认都不排序。如果你想为 map 排序,需要将 key(或者 value)拷贝到一个切片,再对切片排序,然后可以使用切片的 for-range 方法打印出所有的 key 和 value,但是如果你想要一个排序的列表你最好使用结构体切片,这样会更有效。

type name struct {
key string
value int
}

示例:

// the telephone alphabet:
package main
import (
	"fmt"
	"sort"
)
var (
	barVal = map[string]int{"alpha": 34, "bravo": 56, "charlie": 23,
		"delta": 87, "echo": 56, "foxtrot": 12,
		"golf": 34, "hotel": 16, "indio": 87,
		"juliet": 65, "kili": 43, "lima": 98}
)
func main() {
	fmt.Println("unsorted:")
	for k, v := range barVal {
		fmt.Printf("Key: %v, Value: %v / ", k, v)
	}
	keys := make([]string, len(barVal))
	i := 0
	for k, _ := range barVal {
		keys[i] = k
		i++
	}
	sort.Strings(keys)
	fmt.Println()
	fmt.Println("sorted:")
	for _, k := range keys {
		fmt.Printf("Key: %v, Value: %v / ", k, barVal[k])
	}
}

六、将 map 的键值对调

这里对调是指调换 key 和 value。如果 map 的值类型可以作为 key 且所有的 value 是唯一的,那么通过下面的方法可以简单的做到键值对调。如果原始 value 值不唯一那么这么做肯定会出错;为了保证不出错,当遇到不唯一的 key 时应当立刻停止,这样可能会导致没有包含原 map 的所有键值对!一种解决方法就是仔细检查唯一性并且使用多值 map,比如使用 map[int][]string 类型。

package main
import (
"fmt"
)
var (
barVal = map[string]int{"alpha": 34, "bravo": 56, "charlie": 23,
"delta": 87, "echo": 56, "foxtrot": 12,
"golf": 34, "hotel": 16, "indio": 87,
"juliet": 65, "kili": 43, "lima": 98}
)
func main() {
invMap := make(map[int]string, len(barVal))
for k, v := range barVal {
invMap[v] = k
}
fmt.Println("inverted:")
for k, v := range invMap {
fmt.Printf("Key: %v, Value: %v / ", k, v)
}
}

 

电力电子技术(13)——大功率可控整流电路 目录引言2.6.1 带平衡电抗器的双反星形可控整流电路电路结构的特点接平衡电抗器的原因平衡电抗器使得两组三相半波整流电路同时导电的原理分析谐波分析2.6.2 多重化整流电路概述原理目标1)移相多重联结2)多重联结电路的顺序控制3重晶闸管整流桥顺序控制带平衡电抗器的双反星形可控整流电路(是多重化整流电路的重要形式之一)的特点:适用于低电压、大电流的场合。多重化整流电路的特点:绕组的极性相反的目的:消除直流磁通势如图所示,虽然两组相电流的瞬时值不同,但是平均电流相等而绕组的极性相反,所以直流安匝(电流*匝数)互 阅读详情

相关推荐

PLL锁相环性能上不去?可能是电荷泵的电流失配在捣鬼(附Jae-Shin Lee经典方案解析)

本文深入分析了PLL锁相环性能瓶颈的根源——电荷泵电流失配问题,详细解析了Current Mismatch和Current Deviation的区别及其对系统的影响。重点介绍了Jae-Shin Lee的多级电流镜技术,该方案通过运放构建虚拟短路和四级电流镜结构,显著降低了电流失配,使参考杂散改善15dB以上。文章还提供了从仿真到流片的完整优化流程,帮助工程师系统解决电荷泵性能问题。

weixin_30684743的博客 367

golang——map

1.map特点 以键值对为元素的数据集合 特点: 1.键不能重复 2.键必须可哈希(int/bool/float/string/array) 3.无序 快:可以直接根据键值找到数据存储的位置,而不用从前到后一一比对

weixin_45627369的博客 3452

手把手教你用STM32实现三相永磁同步电机FOC控制(附代码)

本文详细介绍了基于STM32的三相永磁同步电机(PMSM)FOC控制实现方法,涵盖硬件设计、软件架构、参数调试及完整代码解析。通过磁场定向控制(FOC)算法,实现高效精准的电机控制,适用于工业自动化、电动汽车等领域。文章还提供了硬件选型建议、电流采样方案对比及PID参数整定技巧,助力开发者快速掌握FOC控制技术。

weixin_29168675的博客 94

【Go语言小知识】len与map的键值对数量

内置函数 len() 可以查询map的长度,该长度值是map中存储的键值对的数量。

gopet 3213

基于Matlab-Simulink的大林算法控制系统设计与振铃消除实验

本文详细介绍了基于Matlab-Simulink的大林算法控制系统设计与振铃消除实验。通过分析纯滞后系统的控制难题,探讨大林算法在工业控制中的应用优势,并提供Matlab-Simulink环境搭建、控制器D(z)设计、振铃消除及仿真实验的完整流程。文章还对比了大林算法与PID控制的性能差异,为工程实践提供参考。

dropout6artist的博客 794

latex写论文(TeXstudio工具)

目录前言IEEE模板模板免费分享参考文献写作方法我的.tex文件代码 前言 学校老师要求我们以IEEE顶级会议格式与标准写报告,于是过程虽然麻烦点,但是效果还是不错了,下面先展示一下自己写完的效果。 IEEE模板 我是在 Overleaf 上注册了个账号下载了模板,里面有各种会议论文的写作模板,这个注册还挺麻烦,要外网注册,国内邮箱都不行。进行后点菜单,菜单里有下载源码。 https://cn.overleaf.com/project/5fe5b082dff088649fc67106 模板免费分享 已

小样yx的博客 6749

Go语言学习之路(二)

函数体}func:函数由 func 开始声明function_name:函数名称,参数列表和返回值类型构成了函数签名。parameter list:参数列表,参数就像一个占位符,当函数被调用时,你可以将值传递给参数,这个值被称为实际参数。参数列表指定的是参数类型、顺序、及参数个数。参数是可选的,也就是说函数也可以不包含参数。return_types:返回类型,函数返回一列值。return_types 是该列值的数据类型。有些功能不需要返回值,这种情况下 return_types 不是必须的。

qq_43681154的博客 469

EM4095低频RFID曼彻斯特解码实战:从原理图到MCU代码实现

本文详细介绍了EM4095低频RFID读卡器的设计与实现,从芯片工作原理、天线设计到曼彻斯特解码算法。重点讲解了基于STM32的MCU代码实现,包括定时器捕获、数字滤波和错误处理,为开发125kHz RFID系统提供实用指南。

oil88的博客 713

golang go语言_Go(Golang)编程语言

golang go语言Go (or golang) is a programming language created at Google in 2007 by Robert Griesemer, Rob Pike, and Ken Thompson. It is a compiled, statically-typed language in the tradition of Algol and...

cumian8165的博客 1070

【AI智能体】Coze 数据库从使用到实战操作详解

Coze 数据库使用到实战详解

congge 5911

OP-TEE虚拟化支持详解

OP-TEE虚拟化支持解析 OP-TEE提供实验性虚拟化方案,支持多虚拟机共享安全执行环境。核心特性包括: 配置选项:CFG_VIRTUALIZATION启用虚拟化,CFG_VIRT_GUEST_COUNT限制虚拟机数量并分配均等内存资源; Hypervisor协作:需实现虚拟机生命周期通知、SMC参数转换、内存固定等关键协议; 当前限制:仅支持Armv8架构,硬件资源共享有限,采用静态内存配额机制; 架构实现:通过MMU分区切换和扩展内存分配器实现多租户隔离,Nexus核心层管理虚拟机上下文。该方案适用于

Linux内核架构师 109

Go语言学习笔记(六)---map

Go语言学习笔记(六)---map

Destinyxzc的博客 976

【WRFDA教程】客观分析(OBSGRID)详解

客观分析(OBSGRID)详解

WW、forever的博客 1133

GO语言学习笔记(六、map)

map 类似其它语言中的哈希表或者字典,以key-value形式存储数据 Key必须是支持==或!=比较运算的类型,不可以是函数、map或slice Map查找比线性搜索快很多,但比使用索引访问数据的类型慢100倍 Map使用make()创建,支持:=这种简写方式 make([keyType]valueType,cap),cap表示容量,可省略 超出容量时会自动扩容,但尽量提供一个合理...

分享AI、区块链技术及应用,未来已来 226

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【Golang】Go语言Map详解

文章介绍golang map的一些基本使用方法。进一步地用图表的方式展示了map涉及的数据结构。

Daniel的博客 1547

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Golang清空map的两种方式及性能比拼

一、Golang中删除map的方法 1、所有Go版本通用方法 a := make(map[string]int) a["a"] = 1 a["b"] = 2 // clear all a = make(map[string]int) 2. Go 1.11版本以上用法 通过Go的内部函数mapclear方法删除。这个函数并没有显示的调用方法,当你使用for循环遍历删除所有元素时,Go的编译器会优化成Go内部函数mapclear。 package main func main() { m

辰若寒的博客 1万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Golang学习笔记_16——Map

在Go语言中,map是一种内置的数据结构,用于存储键值对(key-value pairs)。map提供了快速的查找、插入和删除操作,使得它在处理需要快速访问的数据时非常高效。

LuckyLay的博客 975

Golang Map类型

在Go中,map是哈希表的引用,是一种key-value数据结构。map类型写作map[K]V,其中K和V分别对应key和value的类型。map中所有的key都是相同的类型,所有的value也是相同的类型,但key和value可以是不同的类型,value通常使用自定义类型。map内部需要通过判断两个key是否相等以确保每个键的唯一性,因此key的数据类型必须是可比较,如果key是自定义类型,则要求自定义类型中的所有字段是可比较的。

2021dragon的博客 2045

Golang Map 中的 key 为什么是无序的

不要依赖map遍历时返回的key顺序,采用随机选择遍历起始位置的方式使得遍历时返回是乱序的。如果想得到有序键值,请依靠有序切片进行访问来得到有效的有序 Map

猫轻王的博客 1769

Go语言学习、Map结构

前面我们学习了Go语言中的数组,切片类型。但是我们发现使用数组或切片存储的数据量如果比较大,那么通过下标来取出某个具体数据的时候,相对来说比较麻烦。 我们在数组或是切片中取值时,往往需要遍历这个数组或切片。比较麻烦。 那么有没有一种数据结构,能够帮我们快速的取出数据呢?那就Map结构,也就是字典结构。 Go语言中的结构是由键和值构成的,与其他语言类似。以键值对的形式存在。 某个键(key)...

王帅的博客 6032

【Go语言学习】(六)map

本文参考李文周的博客,并加了一些自己的理解 map map是一种无序的基于key-value的数据结构,Go语言中的map和切片是引用类型,必须初始化才能使用。 map定义 Go语言中map的定义语法如下: map[KeyType]ValueType 其中, KeyType:表示键的类型。 ValueType:表示键对应的值的类型。 map类型的变量默认初始值为nil,需要使用...

weixin_39966701的博客 383

关于《Go语言学习笔记》这本书

#关于《Go语言学习笔记》这本书 书如其名,真的算是一本笔记,书中大量篇幅都是代码块,文字介绍较少,基础理论内容也很少, 更多的是对某一些特性和一些用法上做实践,并且如果你细读的话也会发现一些写错的地方。 如果非要嗑这本书 建议先看一遍**《Go by Example 中文版》**,对基本使用和语法有一定了解后再嗑 笔者下卷部分并没有继续看,因为感觉还不到看源码的时候,所以再深造一段时间在回来看一下。 这里粗略的整理一下知识点,没时间看这本书,可以看一下笔者整理的部分,并不全,也只是针对笔者感兴趣的地方进行

xiao4-800K的博客 1321

golang基础语法(六)Map

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

2303_80933038的博客 1257

Go最全Golang 中的 map 详解_golang map(2),2024年最新面试杀手锏

在计算机科学里,被称为相关数组、map、符号表或者字典,是由一组 对组成的抽象数据结构,并且同一个 key 只会出现一次。两个关键点:map 是由 key-value 对组成的;key 只会出现一次。map 的设计也被称为 “The dictionary problem(字典问题)”,它的任务是设计一种数据结构用来维护一个集合的数据,并且可以同时对集合进行增删查改的操作。2、map 的数据结构。

2401_84904661的博客 1093

go语言基础语法,go语言学习超详细笔记

类型常用符号算术+ - * / %比较==!逻辑`&&赋值位运算`&其他++ --(只能单独使用)import fmtvar nums [10]int/'初始化数组,默认元素都为0'//'如果数组长度不确定,可以使用 ... 代替数组的长度,编译器会根据元素个数自行推断数组的长度:'//'如果设置了数组的长度,我们还可以通过指定下标来初始化元素:'/// 将索引为 1 和 3 的元素初始化/'将50.0赋值为balance[4]'//'访问'/// Step 1: 创建数组。

2503_91344087的博客 779

Golang map

前言 哈希表是一种巧妙并且实用的数据结构。它是一个无序的 key/value对 的集合,其中所有的 key 都是不同的,然后通过给定的 key 可以在常数时间复杂度内检索、更新或删除对应的 value。 在 Go 语言中,一个 map 就是一个哈希表的引用,map 类型可以写为 map[K]V,其中 K 和 V 分别对应 key 和 value。map 中所有的 key 都有相同的类型,所有的 value 也有着相同的类型,但是 key 和 value 之间可以是不同的数据类型。其中 K 对应的 key 必

李培冠的博客 1万+
上一篇: Go语言学习笔记(五)------数组与切片
下一篇: Go语言学习笔记(七)------包(package)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值