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

小技巧分享:在 Go 如何實現枚舉?

開發 后端
Go 語言并沒有 enum 關鍵字,有用過 Protobuf 等的小伙伴知道,Go 語言只是 ”有限的枚舉“ 支持,我們也會用常量來定義,枚舉值也需要有字面意思的映射。

[[404637]]

本文轉載自微信公眾號「腦子進煎魚了」,作者陳煎魚。轉載本文請聯系腦子進煎魚了公眾號。

大家好,我是煎魚。

在日常的業務工程開發中,我們常常會有使用枚舉值的訴求,枚舉控的好,測試值邊界一遍過...

有的小伙伴會說,在 Go 語言不是有 iota 類型做枚舉嗎,那煎魚你這篇文章還講什么?

講道理,Go 語言并沒有 enum 關鍵字,有用過 Protobuf 等的小伙伴知道,Go 語言只是 ”有限的枚舉“ 支持,我們也會用常量來定義,枚舉值也需要有字面意思的映射。

示例

在一些業務場景下,是沒法達到我們的訴求的。示例如下:

  1. type FishType int 
  2.  
  3. const ( 
  4.  A FishType = iota 
  5.  B 
  6.  C 
  7.  D 
  8.  
  9. func main() { 
  10.  fmt.Println(A, B, C, D) 

輸出結果為:“0 1 2 3”。這時候就一臉懵逼了...枚舉值,應該除了鍵以外,還得有個對應的值。也就是這個 “0 1 2 3” 分別對應著什么含義,是不是應該輸出 ”A B C D“

但 Go 語言這塊就沒有直接的支撐了,因此這不是一個完整的枚舉類型的實現。

同時假設我們傳入超過 FishType 類型聲明范圍的枚舉值,在 Go 語言中默認也不會有任何控制,是正常輸出的。

上述這種 Go 枚舉實現,在某種情況下是不完全的,嚴格意義上不能成為 enum(枚舉)。

使用 String 做枚舉

如果要支持枚舉值的對應輸出的話,我們可以通過如下方式:

  1. type FishType int 
  2.  
  3. const ( 
  4.  A FishType = iota 
  5.  B 
  6.  C 
  7.  D 
  8.  
  9. func (f FishType) String() string { 
  10.  return [...]string{"A""B""C""D"}[f] 

運行程序:

  1. func main() { 
  2.  var f FishType = A 
  3.  fmt.Println(f) 
  4.  switch f { 
  5.  case A: 
  6.   fmt.Println("腦子進煎魚了"
  7.  case B: 
  8.   fmt.Println("記得點贊"
  9.  default
  10.   fmt.Println("別別別..."
  11.  } 

輸出結果:

  1. 腦子進煎魚了 

我們可以借助 Go 中 String 方法的默認約定,針對于定義了 String 方法的類型,默認輸出的時候會調用該方法。

這樣就可以達到獲得枚舉值的同時,也能拿到其映射的字面意思。

自動生成 String

但每次手動編寫還是比較麻煩的。在這一塊,我們可以利用官方提供的 cmd/string 來快速實現。

我們安裝如下命令:

  1. go install golang.org/x/tools/cmd/stringer 

在所需枚舉值上設置 go:generate 指令:

  1. //go:generate stringer -type=FishType 
  2. type FishType int 

在項目根目錄執行:

  1. go generate ./... 

會在根目錄生成 fishtype_string.go 文件:

  1. ├── fishtype_string.go 
  2. ├── go.mod 
  3. ├── go.sum 
  4. └── main.go 

fishtype_string 文件內容:

  1. package main 
  2.  
  3. import "strconv" 
  4.  
  5. const _FishType_name = "ABCD" 
  6.  
  7. var _FishType_index = [...]uint8{0, 1, 2, 3, 4} 
  8.  
  9. func (i FishType) String() string { 
  10.  if i < 0 || i >= FishType(len(_FishType_index)-1) { 
  11.   return "FishType(" + strconv.FormatInt(int64(i), 10) + ")" 
  12.  } 
  13.  return _FishType_name[_FishType_index[i]:_FishType_index[i+1]] 

所生成出來的文件,主要是根據枚舉值和映射值做了個映射,且針對超出枚舉值的場景進行了判斷:

  1. func main() { 
  2.  var f1 FishType = A 
  3.  fmt.Println(f1) 
  4.  var f2 FishType = E 
  5.  fmt.Println(f2) 

執行 go run . 查看程序運行結果:

  1. $ go run . 
  2. FishType(4) 

總結

在今天這篇文章中,我們介紹了如何在 Go 語言實現標準的枚舉值,雖然有些繁瑣,但整體不會太難。

 

也有小伙伴已經在社區中提出了 ”proposal: spec: add typed enum support“ 的提案,相信未來有機會能看到 Go 自身支持 enum(枚舉)的那一天。

 

責任編輯:武曉燕 來源: 腦子進煎魚了
相關推薦

2011-07-15 17:35:19

JavaScript

2012-09-11 14:55:29

Moosefs

2010-02-24 12:49:39

WCF枚舉

2011-06-28 13:56:43

JAVA

2011-07-11 10:24:09

PHP

2011-07-12 18:20:45

降權

2011-06-13 17:36:43

外鏈

2011-06-24 17:39:08

長尾關鍵詞

2021-06-07 23:51:16

MacGo服務

2011-07-05 14:59:17

java

2009-12-10 10:24:24

PHP寫入文件

2010-03-05 13:29:00

Python增量備份

2010-01-28 17:12:45

Android閃屏

2024-01-03 08:53:35

JavaScrip編程語言NodeJS

2009-12-03 16:54:36

PHP獲取中國IP段

2009-12-30 16:19:49

Silverlight

2010-02-24 11:22:04

WCF方法重載

2010-03-03 10:10:33

Python實現Soc

2009-12-29 11:01:46

WPF淡入效果

2010-01-04 14:14:43

Silverlight
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美99| 久久久久久成人 | 亚洲色欧美另类 | 可以在线观看av的网站 | 青青青伊人 | 久久精品一区二区三区四区 | 精产嫩模国品一二三区 | 国产免费高清 | 男女羞羞的网站 | 精品国产一区二区在线 | 日韩久久久久久 | 国产精品久久7777777 | 亚洲精品免费在线观看 | 色橹橹欧美在线观看视频高清 | 免费国产一区 | 免费看爱爱视频 | 久久久久九九九女人毛片 | 国产免费一二三区 | 欧美日韩一二区 | 91一区二区三区 | 成人在线视 | 成人免费大片黄在线播放 | 中文字幕1区2区3区 亚洲国产成人精品女人久久久 | 欧美激情欧美激情在线五月 | 男女羞羞视频大全 | 我想看国产一级毛片 | 久久久激情视频 | 国产亚洲欧美在线 | 欧美日韩一区二区视频在线观看 | a免费观看 | www312aⅴ欧美在线看 | 天天影视亚洲综合网 | 激情视频中文字幕 | 久久久国产网站 | 九九亚洲 | 欧美日韩在线播放 | 日本在线黄色 | 午夜午夜精品一区二区三区文 | 久久曰视频 | 亚洲免费人成在线视频观看 | 999国产视频|