首頁  >  文章  >  golang枚舉是啥意思

golang枚舉是啥意思

DDD
DDD原創
2023-06-06 11:53:261007瀏覽

golang枚舉是一種重要的資料類型,由一組鍵值對組成,通常用來在程式語言中充當常數的標識符,在主流行程式語言如c、 java等,都有原生支持,在程式設計領域裡,枚舉用來表示只包含有限數量的固定值的類型,在開發中一般用於標識錯誤碼或狀態機。

golang枚舉是啥意思

本文操作環境:Windows10系統、go1.20版本、dell g3電腦。

枚舉,是一種重要的資料類型,由一組鍵值對組成,通常用來在程式語言中充當常數的標識符。在主流行程式語言如c、 java等,都有原生支援。在go中,大家卻找不到enum或它直接用來聲明枚舉類型的關鍵字。從熟悉其它程式語言的開發者轉用go編程,剛開始會比較難接受這種情況。其實,如果你看到如何在go中表示枚舉類型時,可能會感受到go語言設計者對簡潔性、問題考慮的深度,是一般資淺工程師無法比擬的。在程式設計領域裡,枚舉用來表示只包含有限數量的固定值的型別,在開發中一般用於標識錯誤碼或狀態機。

其實,在go語言設計者的眼裡,enum本質是常數,為什麼要多餘一個關鍵字呢?在go只是沒有enum關鍵字而已,其表現枚舉的形式,與其它語言別無太大區別。下面來看看如果在go中表示枚舉。

學習、使用語言,是學習、理解語言本身的設計哲學,同時也會感受到設計者的性格特質。

基礎工作

為了下面講解方便,這裡使用go modules的方式先建立一個簡單工程。

~/Projects/go/examples  
➜  mkdir enum  
~/Projects/go/examples  
➜  cd enum  
~/Projects/go/examples/enum  
➜  go mod init enum  
go: creating new go.mod: module enum  
~/Projects/go/examples/enum  
➜  touch enum.go

const iota

以 啟動、運行中、停止 這三個狀態為例,使用const關鍵來宣告一系列的常數值。在enum.go中寫上以下內容:

package main  
import "fmt"  
const (  
    Running int = iota  
    Pending  
    Stopped  
)  
func main() {  
    fmt.Println("State running: ", Running)  
    fmt.Println("State pending: ", Pending)  
    fmt.Println("State Stoped: ", Stopped)  
}

儲存並運行,可以得到以下結果,

~/Projects/go/examples/enum   
➜  go run enum.go  
State running:  0  
State pending:  1  
State Stoped:  2

在說明發生了什麼之前,我們先看來一件東西,iota。相較於c、java,go中提供了一個常量計數器,iota,它使用在宣告常數時為常數連續賦值。

例如這個例子,

const (  
    a int = iota // a = 0  
    b int = iota // b = 1  
    c int = iota // c = 2  
)  
const d int = iota // d = 0

在一個 const 宣告區塊中,iota 的初始值為 0,每個宣告一個變數,自增 1。以上的程式碼可以簡化成:

const (  
    a int = iota // a = 0  
    b // b = 1  
    c // c = 2  
)  
const d int = iota // d = 0

設想一下,如果此時有50或100個常數數,在c和java語言中寫出來會是什麼情況。

關於iota,有更多的具體的技巧(例如跳數),詳細請看官方定義iota。

透過使用const來定義一連串的常數,並藉助iota常數計數器,來快速的為數值類型的常數連續賦值,非常方便。雖然沒有了enum關鍵字,在這種情況下發現,是多餘的,枚舉本質上就是常量的組合。

當然,你可以使用以下方式,來更接近其它語言的enum,

// enum.go  
...  
type State int  
const (  
    Running State = iota  
    Pending  
    Stopped  
)  
...

把一組常數值,使用一個類型別名包裹起來,是不是更像其它語言中的enum {}定義了呢?

你也可以將上面的範例改為:

// enum.go  
...  
type State int 
const (  
    Running State = iota  
    Pending  
    Stopped  
)  
func (s State) String() string {  
    switch s {  
    case Running:  
        return "Running"  
    case Pending:  
        return "Pending"  
    case Stopped:  
        return "Stopped"  
    default:  
        return "Unknown" 
     }  
}  
...

#為定義的列舉型別加上String函數,執行結果如下:

~/Projects/go/examples/enum   
➜  go run enum.go  
State running:  Running  
State pending:  Pending  
State Stoped:  Stopped

是不是很魔幻,思路一下又開闊一些,長見識了。把實際的值與列印字元分開,一般語言設計者不會想到。看到這裡,有沒有這種的感覺,go語言的設計者並不是偷懶,而是為了可以偷懶想了很多、做了很多。

以上是golang枚舉是啥意思的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn