go 語言枚舉類型是這么用的?在什么場景下會用到枚舉?本文對 go 語言枚舉做了詳細(xì)講解。
枚舉,是一種重要的數(shù)據(jù)類型,由一組鍵值對組成,通常用來在編程語言中充當(dāng)常量的標(biāo)識符。在主流行編程語言如 c、 java 等,都有原生支持。在 go 中,大家卻找不到 enum 或者其它直接用來聲明枚舉類型的關(guān)鍵字。從熟悉其它編程語言的開發(fā)者轉(zhuǎn)用 go 編程,剛開始會比較難接受這種情況。其實,如果你看到如何在 go 中表示枚舉類型時,可能會感受到 go 語言設(shè)計者對簡潔性、問題考慮的深度,是一般資淺工程師無法比擬的。
其實,在 go 語言設(shè)計者的眼里,enum 本質(zhì)是常量,為什么要多余一個關(guān)鍵字呢?在 go 只是沒有 enum 關(guān)鍵字而已,其表現(xiàn)枚舉的形式,與其它語言別無太大區(qū)別。下面來看看如果在 go 中表示枚舉。
學(xué)習(xí)、使用一門語言,是學(xué)習(xí)、理解語言本身的設(shè)計哲學(xué),同時也會感受到設(shè)計者的性格特點(diǎn)。
基礎(chǔ)工作
為了下面講解方便,這里使用 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
以 啟動、運(yùn)行中、停止 這三個狀態(tài)為例,使用 const 關(guān)鍵來聲明一系列的常量值。在 enum.go 中寫上以下內(nèi)容:
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)
}
保存并運(yùn)行,可以得到以下結(jié)果,
~/Projects/go/examples/enum
? go run enum.go
State running: 0
State pending: 1
State Stoped: 2
在說明發(fā)生了什么之前,我們先看來一件東西,iota。相比于 c、java,go 中提供了一個常量計數(shù)器,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
設(shè)想一下,如果此時有 50 或者 100 個常量數(shù),在 c 和 java 語言中寫出來會是什么情況。
關(guān)于 iota,有更多的具體的技巧(例如跳數(shù)),詳細(xì)請看官方定義 iota
通過使用 const 來定義一連串的常量,并借助 iota 常量計數(shù)器,來快速的為數(shù)值類型的常量連續(xù)賦值,非常方便。雖然沒有了 enum 關(guān)鍵字,在這種情況下發(fā)現(xiàn),是多余的,枚舉本質(zhì)上就是常量的組合。
當(dāng)然,你可以使用以下方式,來更接近其它語言的 enum,
// enum.go
...
type State intconst (
Running State = iota
Pending
Stopped
)
...
把一組常量值,使用一個類型別名包裹起來,是不是更像其它語言中的 enum {} 定義了呢?
你還可以將上面的例子改為:
// enum.go
...
type State intconst (
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 函數(shù),運(yùn)行結(jié)果如下:
~/Projects/go/examples/enum
? go run enum.go
State running: Running
State pending: Pending
State Stoped: Stopped
是不是很魔幻,思路一下又開闊一些,長見識了。把實際的值與打印字符分開,一般語言設(shè)計者不會想到??吹竭@里,有沒有這種的感覺,go 語言的設(shè)計者并不是偷懶,而是為了可以偷懶想了很多、做了很多。
轉(zhuǎn)自:
youwu.today/skill/backend/using-enum-in-golang/
文章轉(zhuǎn)載:OSC開源社區(qū)
責(zé)任編輯:haq
-
開源
+關(guān)注
關(guān)注
3文章
3528瀏覽量
43263 -
枚舉
+關(guān)注
關(guān)注
0文章
16瀏覽量
4677 -
go語言
+關(guān)注
關(guān)注
1文章
158瀏覽量
9230
原文標(biāo)題:Golang 如何表示枚舉類型
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
從 Java 到 Go:面向?qū)ο蟮木奕伺c云原生的輕騎兵
EE-32:語言擴(kuò)展:內(nèi)存存儲類型、ASM和內(nèi)聯(lián)構(gòu)造

影目科技發(fā)布全球首款同傳翻譯眼鏡INMO GO2
Java 枚舉與策略模式、函數(shù)式接口的結(jié)合:實現(xiàn)高內(nèi)聚低耦合的設(shè)計
在學(xué)習(xí)go語言的過程踩過的坑
go語言如何解決并發(fā)問題

鴻蒙原生應(yīng)用元服務(wù)開發(fā)-初識倉頡開發(fā)語言
三十分鐘入門基礎(chǔ)Go Java小子版

鴻蒙原生應(yīng)用元服務(wù)開發(fā)-初識倉頡開發(fā)語言
技術(shù)干貨驛站 ▏深入理解C語言:基本數(shù)據(jù)類型和變量

評論