Like Share Discussion Bookmark Smile

J.J. Huang   2025-02-08   Getting Started Golang 01.基本型別   瀏覽次數:次   DMCA.com Protection Status

Go | 「列舉」的模擬與實踐

💬 簡介

在許多程式語言中,列舉(Enum)是一個非常有用的特性,通常用來表示一組具名常數,這些常數代表了固定的選項或狀態。例如,日曜日、星期一等可使用列舉來進行表示。

但 Go 語言並沒有直接支援列舉型別。不過,我們可以透過 iota 來模擬列舉。iota 是 Go 中的一個常數生成器,它可以用來創建一系列的連續數值,非常適合用來模擬列舉。

本文將介紹如何使用 iota 模擬列舉,並通過範例演示如何在實際程式中運用列舉型別。

圖片來源:Gophers(地鼠造型的原創者為 Renee French)


🔎 Go 語言中的列舉模擬

1️⃣ iota 基本概念

Go 沒有直接的列舉類型,但我們可以使用 iota 來模擬列舉。在 const 區塊中,iota 會自動為每一行常數分配一個遞增的值。

範例:基本的 iota 使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main

import "fmt"

const (
Red = iota // 0
Green // 1
Blue // 2
)

func main() {
fmt.Println("Red:", Red) // 輸出:Red: 0
fmt.Println("Green:", Green) // 輸出:Green: 1
fmt.Println("Blue:", Blue) // 輸出:Blue: 2
}

📝 在這個範例中,iota 從 0 開始自動遞增,分別給 RedGreenBlue 賦予了 012 的值。

2️⃣ 使用 iota 模擬列舉

我們可以利用 iota 來創建更加複雜的列舉。這樣不僅能夠保證值是唯一的,還能保持可讀性和可維護性。

  • 範例:模擬星期列舉
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    package 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
    22
    package 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
    15
    package 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