Golang表示枚舉類型的詳細講解
枚舉,是一種重要的數據類型,由一組鍵值對組成,通常用來在編程語言中充當常量的標識符。在主流行編程語言如 c、 java 等,都有原生支持。在 go 中,大家卻找不到 enum 或者其它直接用來聲明枚舉類型的關鍵字。從熟悉其它編程語言的開發(fā)者轉用 go 編程,剛開始會比較難接受這種情況。其實,如果你看到如何在 go 中表示枚舉類型時,可能會感受到 go 語言設計者對簡潔性、問題考慮的深度,是一般資淺工程師無法比擬的。
其實,在 go 語言設計者的眼里,enum 本質是常量,為什么要多余一個關鍵字呢?在 go 只是沒有 enum 關鍵字而已,其表現枚舉的形式,與其它語言別無太大區(qū)別。下面來看看如果在 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
以 啟動、運行中、停止 這三個狀態(tài)為例,使用 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
在說明發(fā)生了什么之前,我們先看來一件東西,iota。相比于 c、java,go 中提供了一個常量計數器,iota,它使用在聲明常量時為常量連續(xù)賦值。
比如這個例子,
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 常量計數器,來快速的為數值類型的常量連續(xù)賦值,非常方便。雖然沒有了 enum 關鍵字,在這種情況下發(fā)現,是多余的,枚舉本質上就是常量的組合。
當然,你可以使用以下方式,來更接近其它語言的 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表示枚舉類型的詳細講解的文章就介紹到這了,更多相關Golang 枚舉類型內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Golang?Fasthttp選擇使用slice而非map?存儲請求數據原理探索
本文將從簡單到復雜,逐步剖析為什么?Fasthttp?選擇使用?slice?而非?map,并通過代碼示例解釋這一選擇背后高性能的原因,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2024-02-02Go中Goroutines輕量級并發(fā)的特性及效率探究
這篇文章主要為大家介紹了Go中Goroutines輕量級并發(fā)的特性及效率探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12Golang自定義開發(fā)Prometheus?exporter詳解
Exporter是基于Prometheus實施的監(jiān)控系統中重要的組成部分,承擔數據指標的采集工作,這篇文章主要為大家介紹了如何自定義編寫開發(fā)?Prometheus?exporter,感興趣的可以了解一下2023-06-06