Go 為什麼要設計 iota 常量?

煎魚 發表於 2022-06-03
IoT Go

大家好,我是煎魚。

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 的提問中已經有許多社群朋友探討過(果然好奇的小夥伴挺多的)。

本質上 ”iota“ 是希臘字母表的第 9 個字母。它是數學符號的典型,代表一個非常小的東西。

Go 為什麼要設計 iota 常量?

常用於以下的場景:

  • 作為和與演算法中的迭代器。
  • 作為下標索引。
  • 用於複數的虛數部分。

除了 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》中存在著對 iota 的明確定義和說明。

如下:

Go 為什麼要設計 iota 常量?

在一個常量宣告中,預先宣告的識別符號 iota 代表連續的無型別的整數常量。它的值是該常量宣告中各 ConstSpec 的索引,從0開始。

提取核心,Go 中的 iota 填補的是 ConstSpec 索引,也就是連續的無型別的整數常量的位置。

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

總結

在這篇文章中,我們介紹了 Go 中 iota 的基本語法。同時基於歷史資料針對 iota 到底是什麼,為什麼要這麼叫,又有什麼用進行了一番研究。

也需要思考另外一個問題,並不是每一門語言都有 iota。那沒有 iota 的話會怎麼樣,不存在是否也有其合理性呢?

文章持續更新,可以微信搜【腦子進煎魚了】閱讀,本文 GitHub github.com/eddycjy/blog 已收錄,學習 Go 語言可以看 Go 學習地圖和路線,歡迎 Star 催更。

Go 圖書系列