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

掌握Go语言中的映射、常量与指针

映射(Maps)

Go语言中的映射(map)等同于其他编程语言中的哈希表。映射的最大优势是可以使用任何可比较的数据类型作为键,也就是所谓的“map key”或“键”。尽管Go语言中的映射并没有限制哪些数据类型可以作为键,但键必须是可比较的,即Go编译器必须能够区分不同的键,也就是说,键必须支持==操作符。

几乎所有的数据类型都是可比较的,但使用bool类型作为键可能会限制映射的使用场景,而使用浮点数作为键可能会由于机器和操作系统的精度差异带来一些问题。

你可以使用make()函数创建一个键为字符串,值为整数的空映射:

iMap = make(map[string]int)

或者使用字面量直接创建并初始化一个映射:

anotherMap := map[string]int{"k1": 12,"k2": 13,
}

映射是对哈希表的引用,Go隐藏了哈希表的具体实现,因此你无需担心其复杂性。你可以像访问数组或切片一样,使用键访问映射中的元素:

fmt.Println(anotherMap["k1"])

可以使用delete()函数删除映射中的键值对:

delete(anotherMap, "k1")

遍历映射

你可以使用range关键字遍历映射的所有元素:

for key, value := range iMap {fmt.Println(key, value)
}

这是一个简单的示例:

package main
import "fmt"func main() {iMap := make(map[string]int)iMap["k1"] = 12iMap["k2"] = 13fmt.Println("iMap:", iMap)anotherMap := map[string]int{"k1": 12,"k2": 13,}fmt.Println("anotherMap:", anotherMap)delete(anotherMap, "k1")fmt.Println("anotherMap:", anotherMap)_, ok := iMap["doesItExist"]if ok {fmt.Println("存在!")} else {fmt.Println("不存在")}for key, value := range iMap {fmt.Println(key, value)}
}

运行上述代码的输出结果如下:

iMap: map[k1:12 k2:13]
anotherMap: map[k1:12 k2:13]
anotherMap: map[k2:13]
不存在
k1 12
k2 13

值得注意的是,调用delete()函数多次不会有任何影响,且不会产生警告。

nil映射

可以使用nil映射,但不能向其中存储数据。例如:

aMap := map[string]int{}
aMap["test"] = 1

这个代码是合法的。然而,如果你试图向一个nil映射中插入数据,程序会报错:

aMap := map[string]int{}
aMap = nil
aMap["test"] = 1

这会导致运行时错误:panic: assignment to entry in nil map

常量(Constants)

Go语言支持常量,常量的值在程序运行期间是不能改变的。常量使用const关键字来定义。使用常量的主要好处是可以确保它们的值在程序执行期间不会发生变化,且这些值是在编译时确定的。

例如,可以这样定义常量:

const HEIGHT = 200

也可以通过分组的方式定义多个相关的常量:

const (C1 = "常量1"C2 = "常量2"C3 = "常量3"
)

如果你定义了数值型常量,可以在表达式中灵活使用,例如:

const value = 123
const s1 = value * 10

iota常量生成器

iota是Go语言中的常量生成器,常用于声明一系列相关的递增值,无需显式地为每个常量赋值。来看一个例子:

const (Zero = iota  // 0One          // 1Two          // 2Three        // 3
)

也可以在位运算表达式中使用iota

const (p2_0 = 1 << iota  // 1 << 0 = 1p2_2 = 1 << iota  // 1 << 2 = 4p2_4 = 1 << iota  // 1 << 4 = 16
)

运行后的结果如下:

2^0: 1
2^2: 4
2^4: 16

iota的自动递增功能可以在需要生成一系列常量时极大简化代码。

指针(Pointers)

Go语言中支持指针,指针是存储变量内存地址的变量。指针允许你共享数据,尤其是在函数之间传递数据时。你可以通过*来获取指针指向的值,使用&获取变量的内存地址。

例如,定义一个接受指针作为参数的函数:

func getPointer(n *int) {*n = *n * *n
}

指针可以让你在函数内部修改传入的变量,而无需返回任何值:

package main
import "fmt"func getPointer(n *int) {*n = *n * *n
}func main() {i := 10getPointer(&i)fmt.Println("i:", i)  // 输出:i: 100
}

指针虽然功能强大,但使用不当容易引发难以调试的错误,因此在使用时需要格外小心。

总结

Go语言的映射和常量提供了强大的数据处理能力,映射可以存储多种不同类型的数据,并支持动态操作,而常量则确保了程序中的一些值在编译期间不会发生改变。此外,Go语言中的指针允许数据共享,尤其是在处理复杂数据结构时极具优势。通过本文的介绍,读者可以更好地理解和应用这些Go语言中的重要特性。

相关文章:

掌握Go语言中的映射、常量与指针

映射&#xff08;Maps&#xff09; Go语言中的映射&#xff08;map&#xff09;等同于其他编程语言中的哈希表。映射的最大优势是可以使用任何可比较的数据类型作为键&#xff0c;也就是所谓的“map key”或“键”。尽管Go语言中的映射并没有限制哪些数据类型可以作为键&#…...

@35岁的网安人 答应我拿下这些证书

一、CISP注册信息安全专业人员 注册信息安全专业人员(Certified Information Security Professional&#xff0c;简称“CISP")&#xff0c;中国信息安全测评中心依据中编办赋予的职能&#xff0c;建立和发展的一整套完整的信息安全保障人才培训体系。CISP证书是国家对信息…...

flutter Image

Flutter中&#xff0c;Image是一个用于显示图片的控件&#xff0c;可以显示网络图片、本地图片以及Asset中的图片。Image控件支持多种常见的图片格式&#xff0c;例如PNG、JPEG、GIF等。 const Image({super.key,required this.image,this.frameBuilder,this.loadingBuilder,th…...

基于RP2350 MCU的树莓派Pico 2开发板及MicroPython编程使用

2021年1月21日,树莓派基金会同时发布了第1代RP2040 MCU芯片和基于RP2040 MCU的第1代树莓派Pico开发板(Raspberry Pi Pico/ Raspberry Pi Pico 1)。2024年8月8日,树莓派基金会又发布了第2代RP2350 MCU芯片并推出了基于RP2350 MCU的第2代树莓派Pico开发板(Raspberry Pi Pico 2)…...

Docker数据挂载本地目录

docker内的数据映射可以不通过数据卷&#xff0c;直接映射到本地的目录。下面将以mysql容器示例&#xff0c;完成容器的数据映射。 注意&#xff1a;每一个不同的镜像&#xff0c;将来创建容器后内部有哪些目录可以挂载&#xff0c;可以参考DockerHubDocker Hub Container Ima…...

身份证实名认证接口如何用C#实现

一、什么是身份证实名认证&#xff1f; 身份证实名认证又叫身份证实名核验、身份证二要素、身份实名核验、身份证验证&#xff0c;输入姓名、身份证号&#xff0c;校验此两项是否匹配&#xff0c;同时返回生日、性别、籍贯等信息&#xff0c;同时支持港澳台证件核验。 二、身…...

Java开发者无痛丝滑入门Python

哈喽各位道友&#xff0c;经过两周的更新&#xff0c;凡人编程传的第一个“系列”学习笔记《Python基础》已经全部上线啦&#xff0c;现在免费分享给大家&#xff0c;学习路线在下面&#xff0c;点击链接即可跳转对应笔记。 这套笔记有什么不一样的地方呢&#xff1f;这套笔记…...

【STM32】呼吸灯实现

对应pwm概念可以去看我的博客51实现的呼吸灯 根据对应图我们可知预分频系数为999&#xff0c;重装载值为2000&#xff0c;因为设置内部时钟晶振频率为100MHZ &#xff0c;1s跳 100 000000次 &#xff0c;跳一次需要1/100 000000s 20ms0.02s 对应跳的次数为 我们使用通用定时器…...

SQLSERVER查看包含某个字段的所有表

查看包含某个字段的所有表&#xff1a; select [name] from sysobjects where [id] in (select[id] from syscolumns where [name] nettime) ORDER BY Name select [name] from sysobjects where [id] in (select[id] from syscolumns where [name] loadtime) ORDER BY Nam…...

【编程基础知识】mysql中的insert into ... on DUPLICATE key和replace into的性能对比

一、概述 在MySQL中&#xff0c;INSERT INTO ... ON DUPLICATE KEY UPDATE 和 REPLACE INTO 都是用来处理插入或更新数据的语句&#xff0c;但它们在性能和行为上有所不同。 二、REPLACE INTO REPLACE INTO 语句在遇到唯一键或主键冲突时&#xff0c;会先删除旧记录&#xf…...

【CSS in Depth 2 精译_024】4.2 弹性子元素的大小

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09; 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位&#xff08;已完结&#xff09; 2.1 相对…...

你需要尝试的5种讲故事模板

好消息&#xff1a;你不需要成为一位创意写作专家也能讲述一个精彩的故事。 坏消息&#xff1a; 任何人 都可以写一篇博客&#xff0c;或者在社交媒体上发表一些内容&#xff0c;或者拼凑一个故事演示。你需要在大量竞争中抓住目标受众的注意力——更糟的是&#xff0c;内容过…...

只需两步便可生成 51 单片机最精准的延时函数

前言# 我们在学习 51 单片机的过程中会用到延时&#xff0c;比如一个简单的流水灯就需要延时来控制依次点亮的时间&#xff0c;或者一些模块在单片机发出读数据指令后&#xff0c;需要延时几十微秒才可以读出数据等等&#xff0c;这些都离不开延时&#xff0c;所以我们需要一个…...

TETFN情感计算的实践复现(论文复现)

TETFN情感计算的实践复现&#xff08;论文复现&#xff09; 本文所涉及所有资源均在传知代码平台可获取 文章目录 TETFN情感计算的实践复现&#xff08;论文复现&#xff09;概述研究背景主要贡献模型框架数据介绍及下载复现过程&#xff08;重要&#xff09;运行过程及结果 概…...

游戏各个知识小点汇总

抗锯齿原理记录 SSAA&#xff1a;把成像的图片放大N倍&#xff0c;然后每N个点进行平均值计算。一般N为2的倍数。比如原始尺寸是1000x1000&#xff0c;长宽各放大2倍变成2000x2000。 举例&#xff1a; 原始尺寸&#xff1a; 放大2倍后 最后平均值计算成像&#xff1a; MSAA&…...

Python设计模式实战:开启软件设计的精进之旅

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…...

用RNN(循环神经网络)预测股票价格

RNN&#xff08;循环神经网络&#xff09;是一种特殊类型的神经网络&#xff0c;它能够处理序列数据&#xff0c;并且具有记忆先前信息的能力。这种网络结构特别适合于处理时间序列数据、文本、语音等具有时间依赖性的问题。RNN的核心特点是它可以捕捉时间序列中的长期依赖关系…...

08-图7 公路村村通(C)

很明显聪明的同学已经发现&#xff0c;这是一个稠密图&#xff0c;所以用邻接矩阵。可以很好的表达&#xff0c;比邻接表有优势&#xff0c;所以&#xff0c;采用邻接矩阵破题&#xff0c; 当然也可以用邻接表&#xff0c;仔细观察我的AC,会发现其实都一样&#xff0c;只是存储…...

Java-sleep()、wait()、join()、yield()的区别

关于线程&#xff0c;作为八股文面试中必问点&#xff0c;我们需要充分了解sleep()、wait()、join()以及yield()的区别。在正式开始之前先让我们了解两个概念&#xff1a;锁池和等待池 1.锁池 所有需要竞争同步锁的线程都会放在锁池当中&#xff0c;比如当前对象的锁已经被其中…...

Linux命令的补全和自动完成完全开启

前言 在安装好RockyLinux8.8后&#xff0c;输入dn后&#xff0c;按下“TAB”能自动提示&#xff0c;但在输入dnf make后&#xff0c;按下“TAB”不能实现自动补全&#xff0c;如果要使Linux的Bash支持完整的自动提示和补全功能&#xff0c;还需要执行一些其它操作。 内容 1、…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...