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

Golang 如何表示枚舉類型

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

[[421177]]

 go 語言枚舉類型是這么用的?在什么場景下會用到枚舉?本文對 go 語言枚舉做了詳細講解。

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

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

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

基礎工作 

為了下面講解方便,這里使用 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

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

  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)  

保存并運行,可以得到以下結果, 

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

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

比如這個例子, 

  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 

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

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

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

當然,你可以使用以下方式,來更接近其它語言的 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 函數,運行結果如下: 

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

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

 

責任編輯:龐桂玉 來源: 馬哥Linux運維
相關推薦

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#枚舉類型

2010-02-01 16:40:14

C++枚舉子

2011-07-11 15:02:54

枚舉

2009-08-18 13:00:59

C#枚舉類型

2022-08-25 11:38:38

GolangDockerfile

2024-04-07 00:00:10

Rust枚舉C代碼

2009-08-18 09:37:14

C#枚舉類型

2018-03-20 13:56:12

數據庫MySQL枚舉類型

2009-12-22 09:48:58

WCF枚舉類型

2021-11-14 23:05:28

GoCast語言

2017-05-27 20:32:20

2010-03-02 14:12:30

WCF枚舉類型

2009-08-18 10:59:46

C#枚舉類型
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 美女久久久久久久 | 精品久久久久久18免费网站 | 亚洲一区 中文字幕 | 成人无遮挡毛片免费看 | 在线观看亚洲 | 在线一级片 | 欧美极品在线视频 | 精品国产乱码久久久久久88av | 国产精品视频导航 | 求个av网址 | 国产精品综合网 | 亚洲精品美女 | 亚洲精品国产区 | 精品在线观看一区二区 | 日本天天操| 暖暖成人免费视频 | 91免费高清视频 | 91人人在线| 亚洲精品福利视频 | 精品一区二区三区91 | 天天干天天插天天 | 成人av网站在线观看 | 成人免费在线小视频 | 欧美日本韩国一区二区 | 亚洲电影一区 | 亚洲一区二区综合 | 日本一区二区高清不卡 | 在线亚洲电影 | 国产成人综合网 | 成人在线视频观看 | 久久精品视频一区二区三区 | 日韩视频区 | 精品国产一区二区三区性色av | 国产99精品| av小说在线| 日韩精品在线网站 | 国产精品一区二区三区久久 | 亚洲最新网址 | 一级片在线观看 | 亚洲成av人片在线观看无码 | 成人在线黄色 |