Go | 「列舉」的模擬與實踐
💬 簡介
在許多程式語言中,列舉(Enum)是一個非常有用的特性,通常用來表示一組具名常數,這些常數代表了固定的選項或狀態。例如,日曜日、星期一等可使用列舉來進行表示。
但 Go 語言並沒有直接支援列舉型別。不過,我們可以透過 iota
來模擬列舉。iota
是 Go 中的一個常數生成器,它可以用來創建一系列的連續數值,非常適合用來模擬列舉。
本文將介紹如何使用 iota
模擬列舉,並通過範例演示如何在實際程式中運用列舉型別。
圖片來源:Gophers(地鼠造型的原創者為 Renee French)
🔎 Go 語言中的列舉模擬
1️⃣ iota
基本概念
Go 沒有直接的列舉類型,但我們可以使用 iota
來模擬列舉。在 const
區塊中,iota
會自動為每一行常數分配一個遞增的值。
範例:基本的 iota
使用
1 | package main |
📝 在這個範例中,
iota
從 0 開始自動遞增,分別給Red
、Green
、Blue
賦予了0
、1
和2
的值。
2️⃣ 使用 iota 模擬列舉
我們可以利用 iota
來創建更加複雜的列舉。這樣不僅能夠保證值是唯一的,還能保持可讀性和可維護性。
- 範例:模擬星期列舉
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20package main
import "fmt"
const (
Sunday = iota // 0
Monday // 1
Tuesday // 2
Wednesday // 3
Thursday // 4
Friday // 5
Saturday // 6
)
func main() {
fmt.Println("星期日:", Sunday) // 輸出:星期日: 0
fmt.Println("星期一:", Monday) // 輸出:星期一: 1
fmt.Println("星期二:", Tuesday) // 輸出:星期二: 2
fmt.Println("星期三:", Wednesday) // 輸出:星期三: 3
}📝 在這個範例中,我們使用
iota
模擬了星期日到星期六的列舉,並給每個星期一個對應的數值。
3️⃣ 進階:跨越多行區塊
iota
會在每次遇到 const
區塊時重置為 0,因此我們可以利用這個特性,創建更多層次的常數集。
- 範例:多層常數組合
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22package main
import "fmt"
const (
Apple = iota + 1 // 1
Banana // 2
Cherry // 3
)
const (
Monday = iota + 1 // 1
Tuesday // 2
)
func main() {
fmt.Println("Apple:", Apple) // 輸出:Apple: 1
fmt.Println("Banana:", Banana) // 輸出:Banana: 2
fmt.Println("Cherry:", Cherry) // 輸出:Cherry: 3
fmt.Println("Monday:", Monday) // 輸出:Monday: 1
fmt.Println("Tuesday:", Tuesday) // 輸出:Tuesday: 2
}📝 這樣可以讓我們在同一個程式中處理不同範疇的常數,並讓每個範疇有獨立的數值計數。
⚠️ 注意事項
1️⃣ iota
的重置
每當 const
區塊被重新定義時,iota
會重新從 0 開始,這意味著如果你在同一個程式中有多個 const
區塊,iota
會在每個區塊中各自計數。
2️⃣ 列舉的數值
儘管我們使用 iota
可以模擬列舉,但需要注意的是,Go 語言的列舉並不具備像其他語言中那樣的限制功能,它不會強制我們使用預定的數值,仍然需要保持一致性。
✨ 額外補充
使用 iota
在位元運算中的應用
iota
不僅可以用來創建數字列舉,它也可以用來創建位元掩碼。這在處理標誌(flags)時非常有用。
- 範例:位元掩碼模擬列舉
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15package main
import "fmt"
const (
Read = 1 << iota // 0001
Write // 0010
Execute // 0100
)
func main() {
fmt.Println("Read:", Read) // 輸出:Read: 1
fmt.Println("Write:", Write) // 輸出:Write: 2
fmt.Println("Execute:", Execute) // 輸出:Execute: 4
}📝 這個範例中,
iota
被用來創建位元掩碼,並且我們通過位元運算來設定不同的標誌。
🎯總結
Go 語言雖然沒有內建的列舉類型,但我們可以透過 iota
模擬列舉來創建一組有序的常數,並將其用於各種應用中,如選項、狀態或標誌。了解 iota
的運作方式,可以讓我們在 Go 中高效地處理常數集,並保持程式的可讀性與可維護性。
最後建議回顧一下 Go | 菜鳥教學 目錄,了解其章節內容。
註:以上參考了
Go