当前位置: 首页 > news >正文

GO语言学习笔记(与Java的比较学习)(五)

Map

概念

map 是引用类型,可以使用如下声明:

var map1 map[keytype]valuetype
var map1 map[string]int
  • 在声明的时候不需要知道 map 的长度,map 是可以动态增长的。

  • 未初始化的 map 的值是 nil(即零值为nil),nil 映射既没有键,也不能添加键。

key 可以是任意可以用 == 或者!= 操作符比较的类型,比如 string、int、float。所以切片和结构体不能作为 key ,但是指针和接口类型可以。(含有数组切片的结构体不能作为 key,只包含内建类型的 struct 是可以作为 key 的)如果要用结构体作为 key 可以提供 Key()Hash() 方法,这样可以通过结构体的域计算出唯一的数字或者字符串的 key。

value 可以是任意类型的;通过使用空接口类型,我们可以存储任意值,但是使用这种类型作为值时需要先做一次类型断言

如果 key1 是 map1 的 key,那么 map1[key1] 就是对应 key1 的值,就如同数组索引符号一样(数组可以视为一种简单形式的 map,key 是从 0 开始的整数)。

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

map 是 引用类型 的: 内存用 make 方法来分配。

map 的初始化:

var map1 = make(map[keytype]valuetype)

或者简写为:

map1 := make(map[keytype]valuetype)

不要使用 new,永远用 make 来构造 map,因为如果你错误的使用 new () 分配了一个引用对象,你会获得一个空引用的指针,相当于声明了一个未初始化的变量并且取了它的地址

map 容量

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

make(map[keytype]valuetype, cap)

例如:

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

注意:当 map 增长到容量上限的时候,如果再增加新的 key-value 对,map 的大小会自动加 1。所以出于性能的考虑,对于大的 map 或者会快速扩张的 map,即使只是大概知道容量,也最好先标明。

用切片作为 map 的值

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

用结构体作为 map 的值

package main
​
import "fmt"
​
type Vertex struct {Lat, Long float64
}
​
var m = map[string]Vertex{"Bell Labs": Vertex{40.68433, -74.39967,},"Google": Vertex{37.42202, -122.08408,},
}
​
func main() {fmt.Println(m)
}

测试map中是否存在查询键所对应的值

测试 map1 中是否存在 key1:

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 {// ...
}
package main
​
import "fmt"
​
func main() {var value stringvar isPresent bool// 创建一个mapmap1 := make(map[int]string)map1[0] = "a"map1[1] = "b"map1[2] = "c"map1[3] = "d"map1[4] = "e"value, isPresent = map1[3]if isPresent {fmt.Printf("the value of %d is %s", 3, value)}
}

从 map1 中删除 key1:

直接 delete(map1, key1) 就可以。

package main
​
import "fmt"
​
func main() {var value stringvar isPresent bool// 创建一个mapmap1 := make(map[int]string)map1[0] = "a"map1[1] = "b"map1[2] = "c"map1[3] = "d"map1[4] = "e"value, isPresent = map1[3]if isPresent {fmt.Printf("the value of %d is %s\n", 3, value)}delete(map1, 3)value, isPresent = map1[3]// 删除完成后需要检查是否存在,如若没有这行代码,后续依旧会输出“the value of 3 is d”,这是由于“if isPresent {”这段代码弟弟isPresent检查的是是否成功删除,因为成功删除了3,所以会打印if代码段内容if isPresent {fmt.Printf("the value of %d is %s", 3, value)} else {fmt.Println("no such value")}
}

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)
}

示例:

package main
​
import "fmt"
​
func main() {// 创建一个mapmap1 := make(map[int]string)map1[0] = "a"map1[1] = "b"map1[2] = "c"map1[3] = "d"map1[4] = "e"// 输出所有 key 和 valueprintln("打印所有key,value")for key, value := range map1 {fmt.Printf("The key is %d, the value is %s\n", key, value)}print("____________________________________________________")println("只打印value")for _, value := range map1 {fmt.Printf("The value is %s\n", value)}print("____________________________________________________")println("只打印key")for key := range map1 {fmt.Printf("The key is %d\n", key)}
}

map 的排序

map 默认是无序的,不管是按照 key 还是按照 value 默认都不排序,如果你想为 map 排序,需要将 key(或者 value)拷贝到一个切片,再对切片排序。

将 map 的键值对调

这里对调是指调换 key 和 value。如果 map 的值类型可以作为 key 且所有的 value 是唯一的,那么通过下面的方法可以简单的做到键值对调。

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)}
}

学习参考资料:

《Go 入门指南》 | Go 技术论坛 (learnku.com)

Go 语言之旅

相关文章:

GO语言学习笔记(与Java的比较学习)(五)

Map 概念 map 是引用类型,可以使用如下声明: var map1 map[keytype]valuetype var map1 map[string]int 在声明的时候不需要知道 map 的长度,map 是可以动态增长的。 未初始化的 map 的值是 nil(即零值为nil)&…...

Sora:探索大型视觉模型的前世今生、技术内核及未来趋势

Sora,一款由OpenAI在2024年2月推出的创新性文生视频的生成式AI模型,能够依据文字说明,创作出既真实又富有想象力的场景视频,展现了其在模拟现实世界方面的巨大潜能。本文基于公开技术文档和逆向工程分析,全面审视了Sor…...

基于springboot实现图书馆管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现图书馆管理系统演示 摘要 电脑的出现是一个时代的进步,不仅仅帮助人们解决了一些数学上的难题,如今电脑的出现,更加方便了人们在工作和生活中对于一些事物的处理。应用的越来越广泛,通过互联网我们可以更方便地…...

MATLAB环境下基于高斯滤波器-广义拉普拉斯算子的细胞核自动检测

作为病理图像分析的基础,细胞核检测可为细胞形态、纹理等多种相关分析提供支持,对于临床诊断具有重要意义。但是细胞核的人工识别过程十分费时费力,并且不同医生之间存在主观标注差异。因此,利用计算机技术进行自动检测能够更为客…...

【探索AI】十一 深度学习之第1周:深度学习概述与基础

深度学习概述与基础 深度学习的发展历史与现状神经网络的基本原理前向传播与反向传播算法常见的激活函数与优化算法深度学习框架(如TensorFlow或PyTorch)进行基础操作 深度学习的发展历史与现状 深度学习的发展历史可以追溯到上世纪40年代,当…...

【简说八股】Spring事务失效可能是哪些原因?

Spring事务介绍 Spring事务是指在Spring框架中对数据库操作进行管理的一种机制,它确保一组数据库操作要么完全执行成功(提交),要么完全不执行(回滚),从而保持数据一致性和完整性。 Spring框架…...

【语音识别】- CTC损失计算的原理

文章目录 1.符号定义与目标函数2.前向计算 α s ( t ) \alpha_s(t) α...

MySQL字符集和比较规则

MySQL字符集和比较规则 字符集和比较规则简介 字符集: 描述字符与二进制数据的映射关系 比较规则:比较指定字符集中的字符的规则 字符集 我们知道,计算机无法直接存储字符串,实际存储的都是二进制数据。字符集是有限的&#xff…...

备忘录模式(Memento Pattern)

定义 备忘录模式(Memento Pattern)是一种行为设计模式,它允许在不破坏封装性的前提下捕获一个对象的内部状态,并在以后将对象恢复到该状态。备忘录模式通常用于实现撤销操作(Undo)或历史记录(H…...

LeetCode 刷题 [C++] 第121题.买卖股票的最佳时机

题目描述 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的…...

ORACLE 基础

一.ORACLE简介 1.1什么是oracle ORACLE 数据库系统是美国 ORACLE 公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或 B/S 体系结构的数据库之一。 ORACLE 通常应用于大型系统的数据库产品。…...

Adobe illustrator CEP插件调试

1.创建插件CEP面板,可以参考:http://blog.nullice.com/%E6%8A%80%E6%9C%AF/CEP-%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B/%E6%8A%80%E6%9C%AF-CEP-%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B-Adobe-CEP-%E6%89%A9%E5%B1%95%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8…...

学会玩游戏,智能究竟从何而来?

最近在读梅拉妮米歇尔《AI 3.0》第三部分第九章,谈到学会玩游戏,智能究竟从何而来? 作者: [美] 梅拉妮米歇尔 出版社: 四川科学技术出版社湛庐 原作名: Artificial Intelligence: A Guide for Thinking Humans 译者: 王飞跃 / 李玉珂 / 王晓…...

Unity 常用操作

2D素材网站 https://craftpix.net/ https://itch.io/game-assets/tag-2d/tag-backgrounds 3D素材资源网址 https://www.mixamo.com/#/ 场景常用操作: 快捷键:QWER Q:Q键或鼠标中键,可以拉动场景。 W:选中物体后&…...

【计算机网络_应用层】协议定制序列化反序列化

文章目录 1. TCP协议的通信流程2. 应用层协议定制3. 通过“网络计算器”的实现来实现应用层协议定制和序列化3.1 protocol3.2 序列化和反序列化3.2.1 手写序列化和反序列化3.2.2 使用Json库 3.3 数据包读取3.4 服务端设计3.5 最后的源代码和运行结果 1. TCP协议的通信流程 在之…...

Doris实战——银联商务实时数仓构建

目录 前言 一、应用场景 二、OLAP选型 三、实时数仓构建 四、实时数仓体系的建设与实践 4.1 数仓分层的合理规划 4.2 分桶分区策略的合理设置 4.3 多源数据迁移方案 4.4 全量与增量数据的同步 4.5 离线数据加工任务迁移 五、金融级数仓稳定性最佳实践 5.1 多租户资…...

代码随想录算法训练营第七天

● 自己看到题目的第一想法 第454题.四数相加II 方法&#xff1a; 方法一&#xff1a; 暴力法 思路&#xff1a; 注意&#xff1a; 代码&#xff1a; class Solution { public:int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<i…...

文件操作和IO(2):Java中操作文件

目录 一、File的属性 二、File的构造方法 三、File的方法 四、代码示例 1、getName&#xff0c;getParent&#xff0c;getPath方法 2、getAbsolutePath&#xff0c;getCanonicalPath方法 3、exists&#xff0c;isDirectory&#xff0c;createNewFile方法 4、createNewF…...

人工智能-零基础

机缘 扩充下知识栈&#xff0c;准备零基础开始 人工智能零基础 日常 日常水一下博客… 憧憬 努力成为一个会人工智能的程序员...

网络爬虫部分应掌握的重要知识点

目录 一、预备知识1、Web基本工作原理2、网络爬虫的Robots协议 二、爬取网页1、请求服务器并获取网页2、查看服务器端响应的状态码3、输出网页内容 三、使用BeautifulSoup定位网页元素1、首先需要导入BeautifulSoup库2、使用find/find_all函数查找所需的标签元素 四、获取元素的…...

机器学习与重要性采样融合:高效估计黑盒模型尾部风险

1. 项目概述在金融工程和风险管理的核心地带&#xff0c;我们常常需要面对一个棘手的现实&#xff1a;许多关键的风险模型&#xff0c;例如保险公司用于评估极端赔付的内部模型&#xff0c;或者银行用于压力测试的复杂资产定价引擎&#xff0c;本质上都是“黑盒”。这些模型接受…...

UnityExplorer自由视角相机终极指南:3种模式带你突破游戏视角限制

UnityExplorer自由视角相机终极指南&#xff1a;3种模式带你突破游戏视角限制 【免费下载链接】UnityExplorer An in-game UI for exploring, debugging and modifying IL2CPP and Mono Unity games. 项目地址: https://gitcode.com/gh_mirrors/un/UnityExplorer 你是否…...

【DeepSeek微调实战权威指南】:20年NLP专家亲授5种工业级微调策略与避坑清单

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;DeepSeek微调的核心原理与工业级定位 DeepSeek系列大模型&#xff08;如DeepSeek-V2、DeepSeek-Coder&#xff09;以其高推理效率、强代码生成能力及开放权重策略&#xff0c;成为工业界微调实践的重要…...

5分钟掌握暗黑破坏神2存档编辑:免费开源工具完全攻略

5分钟掌握暗黑破坏神2存档编辑&#xff1a;免费开源工具完全攻略 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 还在为暗黑2刷装备而烦恼&#xff1f;想快速体验不同build却不想重复练级&#xff1f;d2s-editor这款暗黑破坏神2…...

MASA模组汉化终极指南:快速实现Minecraft中文界面本地化

MASA模组汉化终极指南&#xff1a;快速实现Minecraft中文界面本地化 【免费下载链接】masa-mods-chinese 一个masa mods的汉化资源包 项目地址: https://gitcode.com/gh_mirrors/ma/masa-mods-chinese 你是否曾经因为MASA模组的英文界面而感到困扰&#xff1f;面对复杂的…...

3步解锁专业中文Figma设计环境:告别语言障碍的设计革命

3步解锁专业中文Figma设计环境&#xff1a;告别语言障碍的设计革命 【免费下载链接】figmaCN 中文 Figma 插件&#xff0c;设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 还在为Figma的英文界面而烦恼吗&#xff1f;每次设计时都要在"F…...

机器学习处理高维小样本数据:特征选择与数据增强在前列腺癌分期中的应用

1. 项目概述&#xff1a;当机器学习遇见前列腺癌分期在生物医学研究的前沿&#xff0c;尤其是肿瘤学领域&#xff0c;我们正面临一个既充满希望又极具挑战的局面&#xff1a;数据爆炸式增长&#xff0c;但如何从中提炼出真正能指导临床决策的“金矿”&#xff1f;前列腺癌作为全…...

保姆级教程:一步步教你排查并修复Windows上原神启动器的Qt平台插件错误

彻底解决Windows原神启动器Qt插件报错&#xff1a;零基础环境变量修改指南当你满心欢喜地双击原神启动器图标&#xff0c;准备开启提瓦特大陆的冒险时&#xff0c;屏幕上突然弹出的错误提示框瞬间浇灭了热情&#xff1a;"This application failed to start because no Qt …...

3分钟掌握Translumo:免费实时屏幕翻译工具终极指南

3分钟掌握Translumo&#xff1a;免费实时屏幕翻译工具终极指南 【免费下载链接】Translumo Advanced real-time screen translator for games, hardcoded subtitles in videos, static text and etc. 项目地址: https://gitcode.com/gh_mirrors/tr/Translumo 你是否曾经…...

Rusted PackFile Manager:免费创建全面战争模组的终极工具

Rusted PackFile Manager&#xff1a;免费创建全面战争模组的终极工具 【免费下载链接】rpfm Rusted PackFile Manager (RPFM) is a... reimplementation in Rust and Qt6 of PackFile Manager (PFM), one of the best modding tools for Total War Games. 项目地址: https:/…...