成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Golang 如何表示枚舉類型

開發(fā) 后端
go 語言枚舉類型是這么用的?在什么場景下會用到枚舉?本文對 go 語言枚舉做了詳細(xì)講解。

[[421177]]

 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è)計者的性格特點。

基礎(chǔ)工作 

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

  1. ~/Projects/go/examples  
  2. ➜  mkdir enum  
  3. ~/Projects/go/examples  
  4. ➜  cd enum  
  5. ~/Projects/go/examples/enum  
  6. ➜  go mod init enum  
  7. go: creating new go.mod: module enum  
  8. ~/Projects/go/examples/enum  
  9. ➜  touch enum.go 

const + iota

以 啟動、運行中、停止 這三個狀態(tài)為例,使用 const 關(guān)鍵來聲明一系列的常量值。在 enum.go 中寫上以下內(nèi)容: 

  1. package main  
  2. import "fmt"  
  3. const (  
  4.     Running int = iota  
  5.     Pending  
  6.     Stopped  
  7.  
  8. func main() {  
  9.     fmt.Println("State running: ", Running)  
  10.     fmt.Println("State pending: ", Pending)  
  11.     fmt.Println("State Stoped: ", Stopped)  

保存并運行,可以得到以下結(jié)果, 

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

在說明發(fā)生了什么之前,我們先看來一件東西,iota。相比于 c、java,go 中提供了一個常量計數(shù)器,iota,它使用在聲明常量時為常量連續(xù)賦值。

比如這個例子, 

  1. const (  
  2.     a int = iota // a = 0  
  3.     b int = iota // b = 1  
  4.     c int = iota // c = 2  
  5.  
  6. const d int = iota // d = 0 

在一個 const 聲明塊中,iota 的初始值為 0,每聲明一個變量,自增 1。以上的代碼可以簡化成: 

  1. const (  
  2.     a int = iota // a = 0  
  3.     b // b = 1  
  4.     c // c = 2  
  5.  
  6. 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, 

  1. // enum.go  
  2. ...  
  3. type State int  
  4. const (  
  5.     Running State = iota  
  6.     Pending  
  7.     Stopped  
  8.  
  9. ... 

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

你還可以將上面的例子改為: 

  1. // enum.go  
  2. ...  
  3. type State int 
  4. const (  
  5.     Running State = iota  
  6.     Pending  
  7.     Stopped  
  8.  
  9. func (s State) String() string {  
  10.     switch s {  
  11.     case Running:  
  12.         return "Running"  
  13.     case Pending:  
  14.         return "Pending"  
  15.     case Stopped:  
  16.         return "Stopped"  
  17.     default:  
  18.         return "Unknown" 
  19.      }  
  20.  
  21. ... 

為定義的枚舉類型加上 String 函數(shù),運行結(jié)果如下: 

  1. ~/Projects/go/examples/enum   
  2. ➜  go run enum.go  
  3. State running:  Running  
  4. State pending:  Pending  
  5. State Stoped:  Stopped 

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

 

責(zé)任編輯:龐桂玉 來源: 馬哥Linux運維
相關(guān)推薦

2009-06-25 14:20:01

Java枚舉類型

2011-06-01 16:31:23

枚舉

2024-01-18 00:16:07

2009-08-18 10:47:40

C#枚舉類型

2009-08-18 10:17:25

C#枚舉類型

2011-12-26 15:58:01

枚舉

2009-08-18 12:52:33

C#枚舉類型

2009-08-18 10:35:46

C#枚舉類型

2022-08-25 11:38:38

GolangDockerfile

2024-04-07 00:00:10

Rust枚舉C代碼

2010-02-01 16:40:14

C++枚舉子

2011-07-11 15:02:54

枚舉

2009-08-18 13:00:59

C#枚舉類型

2009-08-18 09:37:14

C#枚舉類型

2018-03-20 13:56:12

數(shù)據(jù)庫MySQL枚舉類型

2017-05-27 20:32:20

2009-12-22 09:48:58

WCF枚舉類型

2010-03-02 14:12:30

WCF枚舉類型

2009-08-18 10:59:46

C#枚舉類型

2009-08-18 10:41:38

C#枚舉類型
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 日韩在线观看精品 | 成人免费一区二区三区牛牛 | 99福利在线观看 | 日韩二区三区 | 色综合视频| 99久久中文字幕三级久久日本 | 欧洲精品视频一区 | 亚洲精品专区 | 国产精品国产三级国产aⅴ原创 | 91精品一区 | 91免费在线看| 欧美一区二区三区 | 久久久综合色 | 九九热精品在线 | 一区二区三区视频在线免费观看 | 四虎永久在线精品免费一区二 | 国产一区二区三区在线观看免费 | 天天看逼 | 欧美激情视频一区二区三区在线播放 | 日韩一区二区三区在线观看 | 欧美日韩亚洲一区二区 | 日韩欧美久久 | 一级网站 | 日本电影一区二区 | 91久久夜色 | 国产精品亚洲成在人线 | 欧美视频免费在线 | 成人久久久 | 蜜桃久久| 久久久久久久久久久久久91 | 日本久久www成人免 成人久久久久 | 涩涩鲁亚洲精品一区二区 | www.国产精 | 999久久久久久久久 国产欧美在线观看 | 精品三区 | 乳色吐息在线观看 | 色婷婷久久久亚洲一区二区三区 | 亚洲精品久久久久中文字幕二区 | 日韩一区二区三区在线 | 亚洲精品一区二区三区蜜桃久 | 成人av电影网 |