Go 语言 iota 的神奇力量

news/2025/2/21 4:19:44/

前言

当你深入研究官网库、开源库或者任何一个 Go 项目时,你都会发现 iota 这个神奇的标识符无处不在。它扮演着一种重要的角色,让代码变得更加简洁、清晰,并提高了可读性和可维护性。它的应用范围广泛,从枚举类型到位运算,再到复杂的常量表达式计算,无所不能。
在本文中,我将带着大家深入探讨 iota 的神奇力量,包括 iota 的介绍和应用场景以及使用技巧和注意事项。
准备好了吗?准备一杯你最喜欢的饮料或茶,随着本文一探究竟吧。

iota 介绍

Within a constant declaration, the predeclared identifier iota represents successive untyped integer constants.Its value is the index of the respective ConstSpec in that constant declaration, starting at zero.[1]

上面的引文来自官网文档 Iota,原话翻译成中文的意思是:
在常量声明中,预先声明的标识符 iota 代表连续的无类型的整数常量。它的值是该常量声明中对应 ConstSpec 的索引,从零开始计数。
简而言之,通过使用 iota,我们可以在常量声明中自动创建一系列连续的整数值,值从零开始,而不需要手动指定每个常量的值。

iota 的应用场景

自动生成递增的常量值

使用 iota 可以方便地生成递增的常量值。在常量声明中的第一个使用 iota 的常量初始化为 0,而后出现的常量的值都会自动递增,这使得在定义一组递增常量时无需手动指定每个常量的值,提高了代码的 可读性 和可 维护性。例如:

const (Apple  = iota // 0Banana        // 1Cherry        // 2
)

构建枚举类型常量

通过使用 iota 可以轻松定义一系列相关的枚举值,而无需为每个值手动指定具体的数字。这样的枚举类型定义更加简洁,并且易于扩展和修改。例如:

type WeekDay intconst (Sunday    WeekDay = iota // 0Tuesday                  // 1Wednesday                // 2Thursday                 // 3Friday                   // 4Saturday                 // 5Monday                   // 6
)

如果想了解更详细的枚举用法,可前往 Go 语言中没有枚举类型,但是我们可以这样做 进行阅读。

表达式计算

通过在常量声明中使用 iota,可以创建复杂的表达式,并在每个常量声明中根据需要调整 iota 的值。这样可以轻松地生成一组具有特定规律的常量。例如:

const (_  = iotaKB = 1 << (10 * iota) // 1 << (10 * 1) = 1024B = 1KBMB = 1 << (10 * iota) // 1 << (10 * 2) = 1048576B = 1MBGB = 1 << (10 * iota) // 1 << (10 * 3) = 1073741824B = 1GBTB = 1 << (10 * iota) // 1 << (10 * 4) = 1099511627776B = 1TB
)

位运算

通过左移运算符(<<)与iota配合使用,方便地生成一组按位运算的常量。例如:

const (FlagNone  = 0         // 0FlagRead  = 1 << iota // 1FlagWrite             // 2FlagExec              // 4
)

iota 的使用技巧和注意事项

跳值使用

我们可以使用 _ (下划线)来忽略某些值,例如:

const (Apple = iota // 0_Banana // 2
)

不同常量块,iota 是独立的

iota 的作用范围是整个常量块,不同常量块的 iota 是独立的,每个常量块中的第一个 iota 的值都是 0。

const (A = iota // 0B        // 1
)const (C = iota // 0D        // 1
)

http://www.ppmy.cn/news/1131581.html

相关文章

Spring的BeanDefinition的作用和使用方法

一、前言 Spring的BeanDefinition是Spring IoC容器中的一个重要概念&#xff0c;它代表了容器中的bean的定义信息&#xff0c;包括bean的类名、属性、依赖关系等。BeanDefinition是Spring容器创建和管理bean的基础&#xff0c;通过BeanDefinition&#xff0c;容器能够了解如何…

Openresty通过Lua+Redis 实现动态封禁IP

求背景 为了封禁某些爬虫或者恶意用户对服务器的请求&#xff0c;我们需要建立一个动态的 IP 黑名单。对于黑名单之内的 IP &#xff0c;拒绝提供服务。并且可以设置失效 1.安装Openresty&#xff08;编译安装&#xff09; wget https://openresty.org/download/openresty-1.…

pytorch第一天(tensor数据和csv数据的预处理)lm老师版

tensor数据&#xff1a; import torch import numpyx torch.arange(12) print(x) print(x.shape) print(x.numel())X x.reshape(3, 4) print(X)zeros torch.zeros((2, 3, 4)) print(zeros)ones torch.ones((2,3,4)) print(ones)randon torch.randn(3,4) print(randon)a …

Scala第九章节

Scala第九章节 scala总目录 章节目标 理解包的相关内容掌握样例类, 样例对象的使用掌握计算器案例 1. 包 实际开发中, 我们肯定会遇到同名的类, 例如: 两个Person类. 那在不改变类名的情况下, 如何区分它们呢? 这就要使用到包(package)了. 1.1 简介 包就是文件夹, 用关…

Linux系统编程系列之进程间通信-消息队列

一、什么是消息队列 消息队列是system-V三种IPC对象之一&#xff0c;是进程间通信的一种方式。 二、消息队列的特性 允许发送的数据携带类型&#xff08;指定发送给谁&#xff09;&#xff0c;具有相同类型的数据在消息队列内部排队&#xff0c;读取的时候也要指定类型&#x…

步进电机驱动时如何计算90°相位差对应的CCR

对于步进电机的两路驱动PWM脉冲&#xff0c;通常需要保持它们的相位差在90以确保电机正常运转。在这种情况下&#xff0c;相位差通常是一个固定值&#xff0c;并且可以通过设置定时器的比较寄存器&#xff08;CCR&#xff09;来实现。 以下是计算CCR值的一般步骤&#xff1a; …

[AIGC] 快速掌握Netty,打造高性能IM服务器!

前言&#xff1a;Netty 是一个非常优秀的网络应用程序框架&#xff0c;支持高并发、高性能的网络通信&#xff0c;适用于开发各种服务器程序&#xff0c;如即时通讯、游戏、物联网等。使用 Netty 可以大大提升服务器程序的性能和可靠性。本文将介绍 Netty 的基本原理和使用方法…

第 114 场 LeetCode 双周赛题解

A 收集元素的最少操作次数 模拟: 反序遍历数组&#xff0c;用一个集合存当前遍历过的不超过 k k k 的正数 class Solution { public:int minOperations(vector<int> &nums, int k) {unordered_set<int> vis;int n nums.size();int i n - 1;for (;; i--) {if…