




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
第Go項目怎么使用枚舉目錄前言為什么要有枚舉定義新類型實現(xiàn)枚舉protobuf中生成的枚舉代碼總結
前言
哈嘍,大家好,我是asong。枚舉是一種很重要的數(shù)據(jù)類型,在java、C語言等主流編程語言中都支持了枚舉類型,但是在Go語言中卻沒有枚舉類型,那有什么替代方案嗎?本文我們來聊一聊這個事情;
為什么要有枚舉
我們以java語言為例子,在JDK1.5之前沒有枚舉類型,我們通常會使用int常量來表示枚舉,一般使用如下:
publicstaticfinalintCOLOR_RED=1;
publicstaticfinalintCOLOR_BLUE=2;
publicstaticfinalintCOLOR_GREEN=3;
使用int類型會存在以下隱患:
不具備安全性,聲明時如果沒有使用final就會造成值被篡改的風險;語義不夠明確,打印int型數(shù)字并不知道其具體含義
于是乎我們就想到用常量字符來表示,代碼就變成了這樣:
publicstaticfinalStringCOLOR_RED="RED";
publicstaticfinalStringCOLOR_BLUE="BLUE";
publicstaticfinalStringCOLOR_GREEN="GREEN";
這樣也同樣存在問題,因為我們使用的常量字符,那么有些程序猿不按套路出牌就可以使用字符串的值進行比較,這樣的代碼會被不斷模仿變得越來越多的,然后屎山就出現(xiàn)了;
所以我們迫切需要枚舉類型的出現(xiàn)來起到約束的作用,假設使用一個枚舉類型做入?yún)?,枚舉類型就可以限定沙雕用戶不按套路傳參,這樣就可以懟他了,哈哈~;
使用枚舉的代碼就可以變成這樣,傳了枚舉之外的類型都不可以了;
publicclassEnumClass{
publicstaticvoidmain(String[]args){
Colorcolor=Color.RED;
convert(color);
System.out.println(());
}
publicstaticvoidconvert(Colorc){
System.out.println(());
}
enumColor{
RED,BLUE,GREEN;
}
Go語言就沒有枚舉類型,我們該使用什么方法來替代呢?
定義新類型實現(xiàn)枚舉
枚舉通常是一組相關的常量集合,Go語言中有提供常量類型,所以我們可以使用常量來聲明枚舉,但也同樣會遇到上述的問題,起不到約束的作用,所以為了起到約束我們可以使用Go語言另外一個知識點--類型定義,Go語言中可以使用type關鍵字定義不同的類型,我們可以為整型、浮點型、字符型等定義新的類型,新的類型與原類型轉換需要顯式轉換,這樣在一定程度上也起到了約束的作用,我們就可以用Go語言實現(xiàn)如下枚舉:
typeOrderStatusint
const(
CREATEOrderStatus=iota+1
PAID
DELIVERING
COMPLETED
CANCELLED
funcmain(){
a:=100
IsCreated(a)
}
上面的代碼就會報錯:
./main.go:19:12:cannotusea(variableoftypeint)astypeOrderStatusinargumenttoIsCreated
定義新的類型可以起到約束作用,比如我們要檢查狀態(tài)機,入?yún)⑾薅吮仨毷荗rderStatus類型,如果是int類型就會報錯。
上面我們的枚舉實現(xiàn)方式只能獲取枚舉值,獲取不到其映射的字面意思,所以我們可以優(yōu)化一下,實現(xiàn)String方法,使用官方提供的cmd/string來快速實現(xiàn),代碼如下:
//go:generatestringer-type=OrderStatus
typeOrderStatusint
const(
CREATEOrderStatus=iota+1
PAID
DELIVERING
COMPLETED
CANCELLED
)
執(zhí)行命令gogenerate./...生成orderstatus_string.go文件:
import"strconv"
func_(){
//An"invalidarrayindex"compilererrorsignifiesthattheconstantvalueshavechanged.
//Re-runthestringercommandtogeneratethemagain.
varx[1]struct{}
_=x[CREATE-1]
_=x[PAID-2]
_=x[DELIVERING-3]
_=x[COMPLETED-4]
_=x[CANCELLED-5]
const_OrderStatus_name="CREATEPAIDDELIVERINGCOMPLETEDCANCELLED"
var_OrderStatus_index=[...]uint8{0,6,10,20,29,38}
func(iOrderStatus)String()string{
i-=1
ifi0||i=OrderStatus(len(_OrderStatus_index)-1){
return"OrderStatus("+strconv.FormatInt(int64(i+1),10)+")"
}
return_OrderStatus_name[_OrderStatus_index[i]:_OrderStatus_index[i+1]]
}
protobuf中生成的枚舉代碼
Go語言使用protobuf會生成對應的枚舉代碼,我們發(fā)現(xiàn)其中也是使用定義新的類型的方式來實現(xiàn)的,然后在封裝一些方法,我們來賞析一下protobuf生成的枚舉代碼:
const(
CREATED
OrderStatus=1
PAIDOrderStatus=2
CANCELEDOrderStatus=3
varOrderStatus_name=map[int32]string{
1:"CREATED",
2:"PAID",
3:"CANCELED",
varOrderStatus_value=map[string]int32{
"CREATED":
1,
"PAID":2,
"CANCELED":3,
func(xOrderStatus)Enum()*OrderStatus{
p:=new(OrderStatus)
*p=x
returnp
func(xOrderStatus)String()string{
returnproto.EnumName(OrderStatus_name,int32(x))
func(x*OrderStatus)UnmarshalJSON(data[]byte)error{
value,err:=proto.UnmarshalJSONEnum(OrderStatus_value,data,"OrderStatus")
iferr!=nil
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年醫(yī)師考試相關政策解讀試題及答案
- 行政法學中多元化的實踐方法探討試題及答案
- 2025年執(zhí)業(yè)藥師考試專題知識分類總結試題及答案
- 護理健康知識宣傳的重要性試題及答案
- 行政管理文化活動自考題及答案
- 綜合醫(yī)療體制試題及答案分析
- 2025年執(zhí)業(yè)醫(yī)師考試的復習流程建立試題及答案
- 行政管理與國策的結合及試題答案
- 行政管理基礎知識試題及答案
- 2025年經(jīng)濟法專題復習計劃試題及答案
- 2018年10月自考00372公安信息學試題及答案含解析
- 煙草行業(yè)安全風險分級管控和事故隱患排查治理雙重預防機制
- 師承指導老師學術思想
- 2016-2023年西安職業(yè)技術學院高職單招(英語/數(shù)學/語文)筆試歷年考點試題甄選合集含答案解析
- 培養(yǎng)孩子的社會交往能力
- 安全生產(chǎn)法律法規(guī)、標準清單
- JCT640-2010 頂進施工法用鋼筋混凝土排水管
- 新疆民居及建筑紋飾介紹(37張)
- 上海機場控制區(qū)通行證管理辦法
- 人教版PEP五年級下冊英語課件Unit4-B-Lets-talk-課件
- 六年級下冊數(shù)學《圓柱的體積》導學案
評論
0/150
提交評論