官术网_书友最值得收藏!

2.3 iota與枚舉

iota在Go語言中是追求極簡的典型案例。iota并非一個或多個英文單詞的縮寫,而是希臘字母表中的第9個字母“ι”(中文音譯為約塔)。在書寫上,是最為簡單的字符,因此引申為“最簡單”這一語義。Go語言中的iota只是一個常量表達式。在一個const塊中,iota代表了當前行的索引值(從0開始)。iota往往出現在常量定義中,尤其是用來定義枚舉。

2.3.1 iota實現自增

1.利用iota來定義累加的常量

在如下代碼段中,我們為周日至周六依次定義了枚舉常量Sunday~Saturday,并依次為其賦值為0~6。

那么,我們可以利用iota來進行形式上的簡化,如代碼清單2-5所示。

代碼清單2-5 利用iota定義常量

執行該代碼段,控制臺的輸出如下:

    0 1 2 3 4 5 6

在該代碼段中,利用iota將常量Sunday~Saturday賦予從0開始的、自增的正整數。利用這種寫法可以最大限度地避免手寫代碼出錯。

2.iota的極簡形式

為了體現iota極簡的特性,代碼清單2-5還可以修改為代碼清單2-6所示的形式。

代碼清單2-6 連續表達式精簡iota的使用

正如2.2.2節中所提到的連續常量的簡寫形式,代碼清單2-6的常量塊中只保留了第一個iota賦值操作,后續常量省略了所有的“=iota”,同樣可以實現自增賦值的功能。

2.3.2 iota計數不會中斷

iota如同一個代碼行計數器,即使在常量組的中間位置中斷了iota的引用,計數器也會隨著代碼行數而自增下去。代碼清單2-7演示了這一場景。

代碼清單2-7 iota表達式的中斷

在該代碼段中,我們特意將常量Wednesday設置為一個字符串“x”,而后續的Thursday、Friday、Saturday仍然保持為iota。執行該代碼,在控制臺上打印的內容如下:

    0 1 2 x 4 5 6

通過輸出可以看出,當iota第一次出現時,其值為0;后續代碼每增加一行,iota如同一個計數器,均會自動加1。Wednesday = "x"只是表示iota代表的計數器沒有被使用,并不影響計數器的繼續累加。

但如果我們將代碼段修改為代碼清單2-8所示的樣子,則執行結果會完全不同。

代碼清單2-8 iota表達式被中斷,且不再使用

該代碼段的執行結果如下:

    0 1 2 x x x x

因為Wednesday = "x"之后的常量未顯式賦值,所以直接默認為Wednesday(距離最近的上一個常量)的值,即字符串“x”。

2.3.3 iota的使用場景

從前面的講述可以看出,iota的主要使用場景為常量塊中的連續常量。因此,連續性是iota的主要特點。這也引發了另外一個問題:一旦在現有常量中間插入一行代碼,就會導致原有的常量值發生改變。例如,一個表示狀態機的常量組定義如下:

在該常量塊中,順序定義了4種狀態,并為其賦值0~3。表面看上去,一切都很完美,但是后續開發者期望增加一個狀態PAUSE,并將它插入RUNNING和FINSIH之間,則會導致FINISH的值發生變更。例如:

對比兩段代碼可知,FINISH的值會由3變更為4。對于開發者而言,有時很難意識到插入一個新的常量定義可能會導致的骨牌效應。例如,數據庫中的一張任務表使用該枚舉值作為狀態字段,并且已有部分數據持久化到了數據庫中,那么,在增加了PAUSE狀態后,很多任務的狀態數據將與業務意義不再匹配。

對于如下明確定義的代碼:

此時,再增加一個新的狀態PAUSE,大多數開發者會意識到不能占用已被分配的值,由此出錯的概率也會大大減小。因此,iota雖然帶來了一定的方便,但對于開發者而言,代碼也變得更加隱晦。

那么,到底怎樣的場景才適合使用iota定義呢?筆者認為,常量組需要具備以下兩個特點:

(1)連續性:要定義的各個常量值具備連續性,是連續的正整數。

(2)數據固化:這些常量是固定且不易發生變更的,例如,周一至周日,1月至12月等。

綜上所述,雖然筆者花費了較多的筆墨來講述iota,但是在實際開發中對于iota的使用需要非常謹慎。畢竟,相較于業務的穩定性,iota帶來的便利可以忽略不計。

主站蜘蛛池模板: 福建省| 定结县| 大悟县| 木兰县| 泸州市| 绩溪县| 分宜县| 来宾市| 长汀县| 昌乐县| 当涂县| 莱阳市| 凌源市| 方正县| 乌拉特前旗| 博乐市| 新营市| 曲水县| 云梦县| 东海县| 关岭| 福建省| 乌兰察布市| 印江| 通山县| 保德县| 全南县| 台中市| 松滋市| 克什克腾旗| 定边县| 垦利县| 监利县| 托克逊县| 邵武市| 泽普县| 康乐县| 靖江市| 昭觉县| 巩留县| 海淀区|