侵權投訴

go語言枚舉類型怎么用

馬哥Linux運維 ? 2021-09-02 09:43 ? 次閱讀

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

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

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

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

基礎工作

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

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

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)

}

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

~/Projects/go/examples/enum

? go run enum.go

State running: 0

State pending: 1

State Stoped: 2

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

比如這個例子,

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

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

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

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

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

~/Projects/go/examples/enum

? go run enum.go

State running: Running

State pending: Pending

State Stoped: Stopped

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

轉自:

youwu.today/skill/backend/using-enum-in-golang/

文章轉載:OSC開源社區

責任編輯:haq

原文標題:Golang 如何表示枚舉類型

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
分享:

評論

相關推薦

借助深度學習算法實現5秒內克隆你的聲音

大家應該都知道聲音克隆技術,通俗的來說就是借助深度學習算法,可以完全模擬某個人的聲音,而且由機器合成....
的頭像 Android編程精選 發表于 09-29 11:45 ? 202次 閱讀

怎樣使用gitHub開源的組件技術來讀寫三菱的plc數據

如何配置網絡參數?怎樣使用代碼來訪問PLC數據? 怎樣使用gitHub開源的組件技術來讀寫三菱的plc數據? ...
發表于 09-29 06:03 ? 0次 閱讀

HPC SIG致力openEuler上的高性能計算軟件生態

經 openEuler 社區技術委員會討論批準,openEuler 社區正式成立 HPC SIG。H....
的頭像 openEuler 發表于 09-26 09:37 ? 309次 閱讀

10種go語言編成中可能導致性能下降的壞實踐

本文總結了10種 go 語言編成中可能導致性能下降的壞實踐。有代碼潔癖的同學來自我檢查吧! 這篇文章....
的頭像 馬哥Linux運維 發表于 09-24 16:55 ? 130次 閱讀

開源的在線流程圖繪制工具

【導語】:開源的在線流程圖繪制工具。 簡介 Wireflow 是一個免費的、開源的在線流程圖繪制工具....
的頭像 Linux愛好者 發表于 09-24 14:10 ? 132次 閱讀

面向對象程序的主要結構特點是什么

相比現在的開源FTP有啥優勢? 面向對象程序的主要結構特點是什么? ...
發表于 09-22 08:37 ? 0次 閱讀

機智云中的App開源項目應該怎么移植

在進行移植前,要下載機智云App源碼。 源碼下載途徑: 1)在機智云下載中心下載https://do....
的頭像 機智云開發者 發表于 09-18 10:57 ? 200次 閱讀
機智云中的App開源項目應該怎么移植

如何去編寫開源avr下載線的源代碼

如何去自制一種開源的avr下載線? 如何去編寫開源avr下載線的源代碼? ...
發表于 09-18 08:40 ? 0次 閱讀

基于103C8T6的雙ICS FOC電機控制開源板調試

STEVAL-05F-ISO(基于103C8T6)雙ICS FOC電機控制開源板調試文檔詳細說明技術交游名開源工作電壓范圍:140V到3...
發表于 09-17 08:19 ? 0次 閱讀

使用Arduino制作一塊開源手表

1 – 引言首先讓我們看下這個項目要考慮到的問題:1.)使用100%Arduino兼容性硬件2.)保證存儲器足夠大可以裝下大量的稍后會擴展...
發表于 09-16 06:54 ? 0次 閱讀

高性能高并發服務器架構分享

由于自己正在做一個高性能大用戶量的論壇程序,對高性能高并發服務器架構比較感興趣,于是在網上收集了不少這方面的資料和大家分...
發表于 09-16 06:45 ? 0次 閱讀

開發板上玩GTA,RISC-V多項移植項目成功運作中

開發板上玩GTA ,RISC-V 多項移植項目成功運作中 ? RISC-V近期再度掀起了不小的熱度,....
的頭像 E4Life 發表于 09-15 09:47 ? 2130次 閱讀
開發板上玩GTA,RISC-V多項移植項目成功運作中

快充技術原理與快速充電原理

一:快充技術原理-快速充電原理  電池核心仍是鋰離子,大多數廠商走的,基本是“開源”和“節流”兩條路——電池廠商努力提升能...
發表于 09-14 08:48 ? 101次 閱讀

STM32F103主控DIY組裝的開源四軸飛行器

STM32F103 主控 DIY 組裝的 開源四軸飛行器1、飛機參數:整體尺寸:150X150X40mm對角槳距:12 cm螺旋槳:75mm有刷電機:...
發表于 09-14 07:52 ? 0次 閱讀

開源飛控板工程文件

首先是一大堆的感謝,太多人的幫助,感謝不完了…………首先要說明,這個PCB工程的出現要感謝論壇上的臺灣大哥 john800422 開...
發表于 09-13 09:22 ? 0次 閱讀

如何開發出F4的飛控

首先是一大堆的感謝,太多人的幫助,感謝不完了…………首先要說明,這個PCB工程的出現要感謝論壇上的臺灣大哥 john800422 開...
發表于 09-13 06:11 ? 0次 閱讀

Kitronik ARCADE游戲手柄實現連連看

連連看相信大家都玩過,但這個用Kitronik AR CADE游戲手柄來玩連連看的項目你相信是一個高....
的頭像 電子森林 發表于 09-08 11:47 ? 303次 閱讀
Kitronik ARCADE游戲手柄實現連連看

AMD FSR技術提供具有超高質量邊緣

AMD FidelityFX Super Resolution超級分辨率銳畫技術(簡稱FSR),是一....
的頭像 AMD中國 發表于 09-07 15:28 ? 429次 閱讀

使用golang channel的諸多特性和技巧

? 本文介紹了使用 golang channel 的諸多特性和技巧,已經熟悉了 go 語言特性的小伙....
的頭像 馬哥Linux運維 發表于 09-06 15:14 ? 181次 閱讀
使用golang channel的諸多特性和技巧

Go編譯器已默認啟用-G=3支持泛型

Go 項目代碼倉庫昨日提交和合并的一個 PR 顯示,Go 語言已在 cmd/compile 中默認啟....
的頭像 馬哥Linux運維 發表于 09-01 15:52 ? 1370次 閱讀
Go編譯器已默認啟用-G=3支持泛型

開放原子全球開發者大會(OADC)?深圳峰會議題征集通道正式開啟

點擊開放原子教育 關注我們 ? ? 開源已成為全球軟件技術和產業創新的主導模式,是技術應用和行業數字....
發表于 08-18 10:31 ? 86次 閱讀
開放原子全球開發者大會(OADC)?深圳峰會議題征集通道正式開啟

支持Hex、Bin、Motorola S文件的開源庫使用

本文為大家分享一個支持Hex、Bin、Motorola S文件鏡像格式之間進行轉換的庫:BIN2HS....
的頭像 multisim 發表于 08-18 09:39 ? 219次 閱讀

開放原子開源基金會理事長楊濤榮膺“TVP騰訊云最具價值專家”獎

點擊右上角關注我們8月10日,開放原子開源基金會收到騰訊云TVP頒發給理事長楊濤的“TVP騰訊云最具價值專家”
發表于 08-13 17:42 ? 129次 閱讀
開放原子開源基金會理事長楊濤榮膺“TVP騰訊云最具價值專家”獎

RT-Thread亮相GOTC全球開源技術峰會

剛剛過去的GOTC全球開源技術峰會,無疑是一場以“開源”為主題的技術盛宴,來自全球頂尖科技創新企業的....
的頭像 Linux閱碼場 發表于 08-13 15:45 ? 5838次 閱讀

倫敦大學國王學院合成大腦3D影像的創建

倫敦大學國王學院(King’s College London)與其合作的醫院和大學一起公布了關于合成....
的頭像 電子元件技術圈 發表于 08-13 10:38 ? 380次 閱讀

軟通動力成為開放原子開源基金會成員:堅持開源開放,繁榮生態

近日,軟通動力與“開放原子開源基金會”簽署協議,加入“開放原子開源基金會”(以下簡稱“開源基金會”)....
的頭像 科訊視點 發表于 08-04 15:23 ? 429次 閱讀

介紹幾種開源嵌入式操作系統

介紹幾種開源嵌入式操作系統(c++ 嵌入式開發實例)-該文檔為介紹幾種開源嵌入式操作系統總結文檔,是....
發表于 08-04 10:25 ? 67次 閱讀
介紹幾種開源嵌入式操作系統

制裁重拳落下后,華為美國子公司難不成躺平了?

在被列入實體清單,并經歷了一系列制裁后,華為分布全球的子公司可以說是遭受了重挫。不過讓人意外的是,華....
的頭像 E4Life 發表于 08-04 09:45 ? 4065次 閱讀
制裁重拳落下后,華為美國子公司難不成躺平了?

詳解剖析Go語言調度模型的設計

golang的MPG調度模型是保障Go語言效率高的一個重要特性,本文詳細介紹了Go語言調度模型的設計....
的頭像 馬哥Linux運維 發表于 07-26 10:12 ? 257次 閱讀
詳解剖析Go語言調度模型的設計

草蛇灰線,伏脈千里,地平線要開源?

或許都已經知道,汽車AI芯片第一梯隊玩家地平線,馬上要有大動作。 官方邀請函的Title清清楚楚:7....
發表于 07-26 09:56 ? 83次 閱讀

開放原子開源基金會 開放原子開源基金會成員

開放源自開源基金會是中國首個開源基金會,是在民政部注冊的非營利性獨立法人機構,致力于開源產業公益事業....
的頭像 如意 發表于 07-08 10:52 ? 1169次 閱讀

Kicad5.1.5中文入門教程電子版下載

Kicad5.1.5中文入門教程電子版下載
發表于 07-07 10:26 ? 173次 閱讀

利用機智云的Android開源app修改教程

前言 為了使自己的app更加的有個人風格,故在網上尋找了很多的參考資料,這里是對自己設計的總結,具體....
的頭像 機智云開發者 發表于 07-05 10:39 ? 328次 閱讀

如何利用Linux終端將圖像轉換成ASCII藝術?

想在 Linux 終端中做一些有趣的事情嗎?把一張普通的圖片轉換成 ASCII 藝術怎么樣? 你知道....
的頭像 Linux愛好者 發表于 06-29 13:53 ? 407次 閱讀

openEuler 社區正式成立 AccLib SIG

經 openEuler 社區技術委員會討論批準,openEuler 社區正式成立 AccLib SI....
的頭像 openEuler 發表于 06-29 10:38 ? 417次 閱讀

一篇文章帶你深入了解Mbed TLS是啥

概要 Mbed TLS是一個開源、可移植、易于使用、代碼可讀性高的SSL庫。可實現常用的加密/解密算....
的頭像 RTThread物聯網操作系統 發表于 06-29 09:58 ? 6333次 閱讀
一篇文章帶你深入了解Mbed TLS是啥

鴻蒙開源意味著什么

鴻蒙開源意味著什么?在華為開發者大會上,大家都為鴻蒙系統而激動,當華為表示會開源的時候,現場掌聲雷動....
的頭像 璟琰乀 發表于 06-28 10:35 ? 1033次 閱讀

NocoDB如何把SQLite、MariaDB等轉成智能電子表格?

簡介 NocoDB 是 Airtable 的開源替代方案,可以“一鍵”將 MySQL、Postgre....
的頭像 數據分析與開發 發表于 06-27 10:16 ? 1000次 閱讀

倪光南:誰擁抱了開源,誰就擁抱了信息技術的未來

“中國目前是開源大國,但還不是開源強國。”這是中國工程院院士倪光南在近日舉辦的openEuler D....
的頭像 通信世界 發表于 06-26 17:00 ? 740次 閱讀

Google Brain和DeepMind聯手發布可以分布式訓練模型的框架

【導讀】AI模型進入大數據時代,單機早已不能滿足訓練模型的要求,最近Google Brain和Dee....
的頭像 中科院長春光機所 發表于 06-26 15:42 ? 674次 閱讀
Google Brain和DeepMind聯手發布可以分布式訓練模型的框架

openEuler開源社區如何做到僅18個月聚集全球5000余名開發者?

開源至今僅用了 18 個月,openEuler 社區就聚集了全球 5000 余名開發者,軟件包數量從....
的頭像 華為計算 發表于 06-25 17:43 ? 676次 閱讀

你們知道BoostKit開源軟件是怎么來的嗎?

邁入多樣性計算時代,ARM已經成為業界主流的計算架構之一。當前,越來越多數據中心用戶選擇遷移到ARM....
的頭像 華為計算 發表于 06-25 11:33 ? 618次 閱讀

openharmony測試框架

OpenHarmony在傳統的單設備系統能力的基礎上,創造性地提出了基于同一套系統能力、適配多種終端....
的頭像 電子魔法師 發表于 06-24 15:56 ? 478次 閱讀

簡單說明k8s和Docker之間的關系

這篇文章主要介紹了k8s和Docker關系簡單說明,本文利用圖文講解的很透徹,有需要的同學可以研究下....
的頭像 Linux愛好者 發表于 06-24 15:48 ? 422次 閱讀

openharmony官網地址入口

OpenHarmony是由開放原子開源基金會(OpenAtom Foundation)創辦及運營的開....
的頭像 電子魔法師 發表于 06-24 15:12 ? 902次 閱讀

openharmony是啥

OpenHarmony是開放原子開源基金會上的一個孵化項目,目標是支持可在多種終端設備上運行。既可運....
的頭像 電子魔法師 發表于 06-24 15:01 ? 383次 閱讀

openharmony是什么

OpenHarmony是開放原子開源基金會上的一個孵化項目,目標是支持可在多種終端設備上運行。既可運....
的頭像 電子魔法師 發表于 06-24 14:24 ? 406次 閱讀

openharmony安裝教程

目前OpenHarmony已經捐獻給了開放原子開源基金會,而開放原子開源基金會是由工信部主管的,所以....
的頭像 獨愛72H 發表于 06-24 11:59 ? 687次 閱讀

鴻蒙openharmony開源 openharmony系統類型

OpenHarmony作為中國首個完全開源的基礎系統,它的意義就十分重大,接受捐獻的開放原子開源基金....
的頭像 獨愛72H 發表于 06-24 11:47 ? 438次 閱讀

openharmony開發

傳統文檔反饋機制通過官網在線反饋文檔問題、等待文檔工程師確認問題,周期性更新發布。問題反饋鏈冗長、文....
的頭像 倩倩 發表于 06-24 11:07 ? 385次 閱讀

openharmony教育

OpenHarmony是一個由華為發起并捐贈給開放原子開源基金會的開源項目,愿景是打造開放的、全球化....
的頭像 倩倩 發表于 06-24 11:02 ? 660次 閱讀

openharmony怎么運行

OpenHarmony的定位是一款面向全場景的開源分布式操作系統。OpenHarmony 的目標是支....
的頭像 牽手一起夢 發表于 06-24 10:50 ? 422次 閱讀
openharmony怎么運行

openharmony java

面向MCU類處理器例如Arm Cortex-M、RISC-V 32位的設備,硬件資源極其有限,支持的....
的頭像 倩倩 發表于 06-24 10:31 ? 439次 閱讀

openharmony主題圓桌會議

2021年5月16日,開放原子開源基金會(以下簡稱“基金會”)在深圳·國際開源谷舉辦了OpenHar....
的頭像 牽手一起夢 發表于 06-24 10:30 ? 511次 閱讀

OpenHarmony源文件多大

華為OpenHarmony捐獻給開放原子開源基金會(OpenAtom Foundation)。開放原....
的頭像 牽手一起夢 發表于 06-24 10:18 ? 396次 閱讀

OpenHarmony下載 源碼獲取方式有哪些

OpenHarmony是由開放原子開源基金會(OpenAtom Foundation)孵化及運營的開....
的頭像 牽手一起夢 發表于 06-24 10:13 ? 359次 閱讀

openharmony開源發布會

openharmony開源發布會。在6月1日的時候開放原子開源基金會正式推出了OpenHarmony....
的頭像 璟琰乀 發表于 06-24 10:09 ? 555次 閱讀

openharmony開源

OpenHarmony整體遵從分層設計,從下向上依次為:內核層、系統服務層、框架層和應用層。系統功能....
的頭像 倩倩 發表于 06-24 10:06 ? 302次 閱讀

openharmony是什么 有什么特點

OpenHarmony是由開放原子開源基金會(OpenAtom Foundation)孵化及運營的開....
的頭像 牽手一起夢 發表于 06-24 09:26 ? 804次 閱讀

震憾!英特爾將首發RISC-V CPU!中國同時全速推進RISC-V開源生態,與AIoT時代共振!

電子發燒友網報道(文/黃晶晶)就在今日(6月23日),據最新消息,英特爾計劃首發的7nm CPU將基....
的頭像 芯鏈 發表于 06-24 08:00 ? 5990次 閱讀
免费无限看黄app_蜜柚app官网下载入口_成版人黄瓜app