Go 为什么要设计 Iota 常量?

开发 前端
在 Go 中枚举常量是使用 iota 枚举器创建的,在功能上,iota 关键字表示从 0 开始的整数常量;在作用上可以简化使用自动递增数字的常量定义,非常方便。

大家好,我是煎鱼。

Go 语言中有一个非常有特色的东西,那就是 iota 常量。经过某鱼的不完全统计,许多 Go 开发者都是由 PHP、Java、C++、Python 等转型过来,对此还是挺好奇的。

今天就由煎鱼和大家一起深入学习。

Go 语法

在 Go 中枚举常量是使用 iota 枚举器创建的,在功能上,iota 关键字表示从 0 开始的整数常量;在作用上可以简化使用自动递增数字的常量定义,非常方便。

以前定义一个枚举值:

const (
a = 0
b = 1
c = 2
)

Go 有了 iota 关键字后:

const (
a = iota
b
c
)

对应的值结果:

a=0
b=1
c=2

甚至还可以跳着来:

const (
a = iota
_
b
c
)

对应的值结果:

a=0
b=2
c=3

也可以玩出花来:

const (
bit0, mask0 = 1 << iota, 1<<iota - 1
bit1, mask1
_, _
bit3, mask3
)

对应的值结果:

bit0 == 1, mask0 == 0  (iota == 0)
bit1 == 2, mask1 == 1 (iota == 1)
(iota == 2, unused)
bit3 == 8, mask3 == 7 (iota == 3)

设计思考

对 iota 有了一定的基本了解后,开始进入我们的主题,和煎鱼一起发散好奇心。

  • 为什么叫 iota,是什么的简称吗?
  • Go 为什么需要有 iota?

为什么叫 iota

实际上 iota 就是全名,在 stackoverflow 的提问[1]中已经有许多社区朋友探讨过(果然好奇的小伙伴挺多的)。

本质上 ”iota“ 是希腊字母表的第 9 个字母。它是数学符号的典型,代表一个非常小的东西。

图片

常用于以下的场景:

  • 作为和与算法中的迭代器。
  • 作为下标索引。
  • 用于复数的虚数部分。

除了 Go 以外,在 APL、C++,又或是 Scheme 均有有 iota 常量的存在(设计),可以给到大家使用。

Scheme iota 的签名如下:

iota count [start step]

作用是返回一个包含计数数字的列表,从起始点开始,每次增加步长。默认的开始是0,默认的步骤是 1。

例如:

(iota 6)(0 1 2 3 4 5)
(iota 4 2.5 -2)(2.5 0.5 -1.5 -3.5)

其实 iota 已经是迭代器的一个约定式命名了,可以认为是也业内通识。

为什么需要有

在《The Go Programming Language Specification[2]》中存在着对 iota 的明确定义和说明。

如下:

图片

在一个常量声明中,预先声明的标识符 iota 代表连续的无类型的整数常量。它的值是该常量声明中各 ConstSpec 的索引,从0开始。

提取核心意义:Go 中的 iota 是 ConstSpec 索引,也就是填补的是连续的无类型整数常量的位置。

因此 Go 中有它的一席位置。

总结

在这篇文章中,我们介绍了 Go 中 iota 的基本语法。同时基于历史资料针对 iota 到底是什么,为什么要这么叫,又有什么用进行了一番研究。

也需要思考另外一个问题,并不是每一门语言都有 iota。那没有 iota 的话会怎么样,不存在是否也有其合理性呢?

参考资料

[1]提问: https://stackoverflow.com/questions/31650192/whats-the-full-name-for-iota-in-golang

[2]The Go Programming Language Specification: https://go.dev/ref/spec#Iota


责任编辑:武晓燕 来源: 脑子进煎鱼了
相关推荐

2021-04-26 09:33:46

Go Iota语言

2022-01-17 16:09:43

Go语言开发

2022-01-19 22:51:57

设计匿名用户

2009-09-07 16:45:54

.NET代码设计

2020-02-24 09:38:05

PythonGo语言Linux

2020-06-22 07:18:21

Java语言开发

2022-01-03 08:06:15

函数Go数据

2021-02-01 08:02:11

设计模式接口

2013-03-12 14:30:09

Ubuntu操作系统

2015-08-06 10:14:15

造轮子facebook

2022-08-15 08:27:02

基站网络

2020-02-27 21:03:30

调度器架构效率

2020-04-07 16:12:56

Go编程语言开发

2021-02-23 10:19:46

编程技能开发

2021-11-19 09:49:00

CC++语法糖

2018-05-23 00:20:29

2009-12-17 15:18:47

2016-08-19 16:27:52

数据库Mongo DB开发

2022-03-30 08:21:57

合并HTTP

2024-08-28 10:49:47

点赞
收藏

51CTO技术栈公众号