掌握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语言中的映射、常量与指针
映射(Maps) Go语言中的映射(map)等同于其他编程语言中的哈希表。映射的最大优势是可以使用任何可比较的数据类型作为键,也就是所谓的“map key”或“键”。尽管Go语言中的映射并没有限制哪些数据类型可以作为键&#…...

@35岁的网安人 答应我拿下这些证书
一、CISP注册信息安全专业人员 注册信息安全专业人员(Certified Information Security Professional,简称“CISP"),中国信息安全测评中心依据中编办赋予的职能,建立和发展的一整套完整的信息安全保障人才培训体系。CISP证书是国家对信息…...

flutter Image
Flutter中,Image是一个用于显示图片的控件,可以显示网络图片、本地图片以及Asset中的图片。Image控件支持多种常见的图片格式,例如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内的数据映射可以不通过数据卷,直接映射到本地的目录。下面将以mysql容器示例,完成容器的数据映射。 注意:每一个不同的镜像,将来创建容器后内部有哪些目录可以挂载,可以参考DockerHubDocker Hub Container Ima…...

身份证实名认证接口如何用C#实现
一、什么是身份证实名认证? 身份证实名认证又叫身份证实名核验、身份证二要素、身份实名核验、身份证验证,输入姓名、身份证号,校验此两项是否匹配,同时返回生日、性别、籍贯等信息,同时支持港澳台证件核验。 二、身…...
Java开发者无痛丝滑入门Python
哈喽各位道友,经过两周的更新,凡人编程传的第一个“系列”学习笔记《Python基础》已经全部上线啦,现在免费分享给大家,学习路线在下面,点击链接即可跳转对应笔记。 这套笔记有什么不一样的地方呢?这套笔记…...

【STM32】呼吸灯实现
对应pwm概念可以去看我的博客51实现的呼吸灯 根据对应图我们可知预分频系数为999,重装载值为2000,因为设置内部时钟晶振频率为100MHZ ,1s跳 100 000000次 ,跳一次需要1/100 000000s 20ms0.02s 对应跳的次数为 我们使用通用定时器…...
SQLSERVER查看包含某个字段的所有表
查看包含某个字段的所有表: 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中,INSERT INTO ... ON DUPLICATE KEY UPDATE 和 REPLACE INTO 都是用来处理插入或更新数据的语句,但它们在性能和行为上有所不同。 二、REPLACE INTO REPLACE INTO 语句在遇到唯一键或主键冲突时,会先删除旧记录…...

【CSS in Depth 2 精译_024】4.2 弹性子元素的大小
当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一章 层叠、优先级与继承(已完结) 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位(已完结) 2.1 相对…...
你需要尝试的5种讲故事模板
好消息:你不需要成为一位创意写作专家也能讲述一个精彩的故事。 坏消息: 任何人 都可以写一篇博客,或者在社交媒体上发表一些内容,或者拼凑一个故事演示。你需要在大量竞争中抓住目标受众的注意力——更糟的是,内容过…...

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

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

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

Python设计模式实战:开启软件设计的精进之旅
🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…...

用RNN(循环神经网络)预测股票价格
RNN(循环神经网络)是一种特殊类型的神经网络,它能够处理序列数据,并且具有记忆先前信息的能力。这种网络结构特别适合于处理时间序列数据、文本、语音等具有时间依赖性的问题。RNN的核心特点是它可以捕捉时间序列中的长期依赖关系…...
08-图7 公路村村通(C)
很明显聪明的同学已经发现,这是一个稠密图,所以用邻接矩阵。可以很好的表达,比邻接表有优势,所以,采用邻接矩阵破题, 当然也可以用邻接表,仔细观察我的AC,会发现其实都一样,只是存储…...
Java-sleep()、wait()、join()、yield()的区别
关于线程,作为八股文面试中必问点,我们需要充分了解sleep()、wait()、join()以及yield()的区别。在正式开始之前先让我们了解两个概念:锁池和等待池 1.锁池 所有需要竞争同步锁的线程都会放在锁池当中,比如当前对象的锁已经被其中…...

Linux命令的补全和自动完成完全开启
前言 在安装好RockyLinux8.8后,输入dn后,按下“TAB”能自动提示,但在输入dnf make后,按下“TAB”不能实现自动补全,如果要使Linux的Bash支持完整的自动提示和补全功能,还需要执行一些其它操作。 内容 1、…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...

C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...

听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...

MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统
Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...

【版本控制】GitHub Desktop 入门教程与开源协作全流程解析
目录 0 引言1 GitHub Desktop 入门教程1.1 安装与基础配置1.2 核心功能使用指南仓库管理日常开发流程分支管理 2 GitHub 开源协作流程详解2.1 Fork & Pull Request 模型2.2 完整协作流程步骤步骤 1: Fork(创建个人副本)步骤 2: Clone(克隆…...
Vue 实例的数据对象详解
Vue 实例的数据对象详解 在 Vue 中,数据对象是响应式系统的核心,也是组件状态的载体。理解数据对象的原理和使用方式是成为 Vue 专家的关键一步。我将从多个维度深入剖析 Vue 实例的数据对象。 一、数据对象的定义方式 1. Options API 中的定义 在 Options API 中,使用 …...