日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
小技巧分享:在Go如何實(shí)現(xiàn)枚舉?

[[404637]]

為新華等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及新華網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、新華網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!

本文轉(zhuǎn)載自微信公眾號(hào)「腦子進(jìn)煎魚了」,作者陳煎魚。轉(zhuǎn)載本文請(qǐng)聯(lián)系腦子進(jìn)煎魚了公眾號(hào)。

大家好,我是煎魚。

在日常的業(yè)務(wù)工程開發(fā)中,我們常常會(huì)有使用枚舉值的訴求,枚舉控的好,測試值邊界一遍過...

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

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

示例

在一些業(yè)務(wù)場景下,是沒法達(dá)到我們的訴求的。示例如下:

 
 
 
 
  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) 

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

但 Go 語言這塊就沒有直接的支撐了,因此這不是一個(gè)完整的枚舉類型的實(shí)現(xiàn)。

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

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

使用 String 做枚舉

如果要支持枚舉值的對(duì)應(yīng)輸出的話,我們可以通過如下方式:

 
 
 
 
  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] 

運(yùn)行程序:

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

輸出結(jié)果:

 
 
 
 
  1. 腦子進(jìn)煎魚了 

我們可以借助 Go 中 String 方法的默認(rèn)約定,針對(duì)于定義了 String 方法的類型,默認(rèn)輸出的時(shí)候會(huì)調(diào)用該方法。

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

自動(dòng)生成 String

但每次手動(dòng)編寫還是比較麻煩的。在這一塊,我們可以利用官方提供的 cmd/string 來快速實(shí)現(xiàn)。

我們安裝如下命令:

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

在所需枚舉值上設(shè)置 go:generate 指令:

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

在項(xiàng)目根目錄執(zhí)行:

 
 
 
 
  1. go generate ./... 

會(huì)在根目錄生成 fishtype_string.go 文件:

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

fishtype_string 文件內(nèi)容:

 
 
 
 
  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]] 

所生成出來的文件,主要是根據(jù)枚舉值和映射值做了個(gè)映射,且針對(duì)超出枚舉值的場景進(jìn)行了判斷:

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

執(zhí)行 go run . 查看程序運(yùn)行結(jié)果:

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

總結(jié)

在今天這篇文章中,我們介紹了如何在 Go 語言實(shí)現(xiàn)標(biāo)準(zhǔn)的枚舉值,雖然有些繁瑣,但整體不會(huì)太難。

 

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

 


新聞標(biāo)題:小技巧分享:在Go如何實(shí)現(xiàn)枚舉?
文章源于:http://www.dlmjj.cn/article/djopeho.html