最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go項(xiàng)目怎么使用枚舉

 更新時(shí)間:2022年08月22日 16:38:33   作者:Golang夢(mèng)工廠  
枚舉是一種很重要的數(shù)據(jù)類型,本文主要介紹了Go項(xiàng)目怎么使用枚舉,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

哈嘍,大家好,我是asong。枚舉是一種很重要的數(shù)據(jù)類型,在java、C語言等主流編程語言中都支持了枚舉類型,但是在Go語言中卻沒有枚舉類型,那有什么替代方案嗎? 本文我們來聊一聊這個(gè)事情;

為什么要有枚舉

我們以java語言為例子,在JDK1.5之前沒有枚舉類型,我們通常會(huì)使用int常量來表示枚舉,一般使用如下:

public static final int COLOR_RED = 1;
public static final int COLOR_BLUE = 2;
public static final int COLOR_GREEN = 3;

使用int類型會(huì)存在以下隱患:

  • 不具備安全性,聲明時(shí)如果沒有使用final就會(huì)造成值被篡改的風(fēng)險(xiǎn);
  • 語義不夠明確,打印int型數(shù)字并不知道其具體含義

于是乎我們就想到用常量字符來表示,代碼就變成了這樣:

public static final String COLOR_RED = "RED";
public static final String COLOR_BLUE = "BLUE";
public static final String COLOR_GREEN = "GREEN";

這樣也同樣存在問題,因?yàn)槲覀兪褂玫某A孔址敲从行┏绦蛟巢话刺茁烦雠凭涂梢允褂米址闹颠M(jìn)行比較,這樣的代碼會(huì)被不斷模仿變得越來越多的,然后屎山就出現(xiàn)了;

所以我們迫切需要枚舉類型的出現(xiàn)來起到約束的作用,假設(shè)使用一個(gè)枚舉類型做入?yún)?,枚舉類型就可以限定沙雕用戶不按套路傳參,這樣就可以懟他了,哈哈~;

使用枚舉的代碼就可以變成這樣,傳了枚舉之外的類型都不可以了;

public class EnumClass {
? ? public static void main(String [] args){
? ? ? ? Color color = Color.RED;
? ? ? ? convert(color);
? ? ? ? System.out.println(color.name());

? ? }

? ? public static void convert(Color c){
? ? ? ? System.out.println(c.name());
? ? }

}

enum Color{
? ? RED,BLUE,GREEN;
}

Go語言就沒有枚舉類型,我們?cè)撌褂檬裁捶椒▉硖娲兀?/p>

定義新類型實(shí)現(xiàn)枚舉

枚舉通常是一組相關(guān)的常量集合,Go語言中有提供常量類型,所以我們可以使用常量來聲明枚舉,但也同樣會(huì)遇到上述的問題,起不到約束的作用,所以為了起到約束我們可以使用Go語言另外一個(gè)知識(shí)點(diǎn) -- 類型定義,Go語言中可以使用type關(guān)鍵字定義不同的類型,我們可以為整型、浮點(diǎn)型、字符型等定義新的類型,新的類型與原類型轉(zhuǎn)換需要顯式轉(zhuǎn)換,這樣在一定程度上也起到了約束的作用,我們就可以用Go語言實(shí)現(xiàn)如下枚舉:

type OrderStatus int

const (
?? ?CREATE OrderStatus = iota + 1
?? ?PAID
?? ?DELIVERING
?? ?COMPLETED
?? ?CANCELLED
)

func main() {
?? ?a := 100
?? ?IsCreated(a)
}

上面的代碼就會(huì)報(bào)錯(cuò):

./main.go:19:12: cannot use a (variable of type int) as type OrderStatus in argument to IsCreated

定義新的類型可以起到約束作用,比如我們要檢查狀態(tài)機(jī),入?yún)⑾薅吮仨毷荗rderStatus類型,如果是int類型就會(huì)報(bào)錯(cuò)。

上面我們的枚舉實(shí)現(xiàn)方式只能獲取枚舉值,獲取不到其映射的字面意思,所以我們可以優(yōu)化一下,實(shí)現(xiàn)String方法,使用官方提供的cmd/string來快速實(shí)現(xiàn),代碼如下:

//go:generate stringer -type=OrderStatus
type OrderStatus int

const (
?? ?CREATE OrderStatus = iota + 1
?? ?PAID
?? ?DELIVERING
?? ?COMPLETED
?? ?CANCELLED
)

執(zhí)行命令go generate ./...生成orderstatus_string.go文件:

import "strconv"

func _() {
?? ?// An "invalid array index" compiler error signifies that the constant values have changed.
?? ?// Re-run the stringer command to generate them again.
?? ?var x [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 (i OrderStatus) String() string {
?? ?i -= 1
?? ?if i < 0 || 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會(huì)生成對(duì)應(yīng)的枚舉代碼,我們發(fā)現(xiàn)其中也是使用定義新的類型的方式來實(shí)現(xiàn)的,然后在封裝一些方法,我們來賞析一下protobuf生成的枚舉代碼:

const (
?? ?CREATED ?OrderStatus = 1
?? ?PAID OrderStatus = 2
?? ?CANCELED OrderStatus = 3
)

var OrderStatus_name = map[int32]string{
?? ?1: "CREATED",
?? ?2: "PAID",
?? ?3: "CANCELED",
}

var OrderStatus_value = map[string]int32{
?? ?"CREATED": ?1,
?? ?"PAID": 2,
?? ?"CANCELED": 3,
}

func (x OrderStatus) Enum() *OrderStatus {
?? ?p := new(OrderStatus)
?? ?*p = x
?? ?return p
}

func (x OrderStatus) String() string {
?? ?return proto.EnumName(OrderStatus_name, int32(x))
}

func (x *OrderStatus) UnmarshalJSON(data []byte) error {
?? ?value, err := proto.UnmarshalJSONEnum(OrderStatus_value, data, "OrderStatus")
?? ?if err != nil {
?? ??? ?return err
?? ?}
?? ?*x = OrderStatus(value)
?? ?return nil
}

總結(jié)

雖然Go語言沒有提供枚舉類型,但是我們也可以根據(jù)Go語言的兩個(gè)特性:常量和定義新類型來實(shí)現(xiàn)枚舉,方法總比困難多嗎,開源庫(kù)是優(yōu)秀的,我們往往可以從高手那里里學(xué)習(xí)很多,記住,請(qǐng)永遠(yuǎn)保持一個(gè)學(xué)徒之心;

到此這篇關(guān)于Go項(xiàng)目怎么使用枚舉的文章就介紹到這了,更多相關(guān)Go 枚舉內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang 內(nèi)存對(duì)齊的實(shí)現(xiàn)

    golang 內(nèi)存對(duì)齊的實(shí)現(xiàn)

    在代碼編譯階段,編譯器會(huì)對(duì)數(shù)據(jù)的存儲(chǔ)布局進(jìn)行對(duì)齊優(yōu)化,本文主要介紹了golang 內(nèi)存對(duì)齊的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-08-08
  • golang字符串拼接實(shí)現(xiàn)方式和區(qū)別對(duì)比

    golang字符串拼接實(shí)現(xiàn)方式和區(qū)別對(duì)比

    本文介紹了Go語言中字符串拼接的多種方法及其優(yōu)缺點(diǎn),推薦使用strings.Builder進(jìn)行頻繁拼接以優(yōu)化內(nèi)存分配和性能,同時(shí),還討論了通過sync.Pool優(yōu)化高頻創(chuàng)建的對(duì)象,以減少垃圾回收壓力,感興趣的朋友一起看看吧
    2025-02-02
  • 在Go中實(shí)現(xiàn)和使用堆棧以及先進(jìn)先出原則詳解

    在Go中實(shí)現(xiàn)和使用堆棧以及先進(jìn)先出原則詳解

    Go是一種功能強(qiáng)大的編程語言,提供了豐富的數(shù)據(jù)結(jié)構(gòu)和算法,堆棧是計(jì)算機(jī)科學(xué)中的基本數(shù)據(jù)結(jié)構(gòu)之一,在本博文中,我們將探討如何在?Go?中實(shí)現(xiàn)和使用堆棧,以及堆棧如何遵循先進(jìn)先出?(FIFO)?原則
    2023-10-10
  • Go語言中的各類運(yùn)算操作符詳解

    Go語言中的各類運(yùn)算操作符詳解

    本文全面探討了Go語言中的各類運(yùn)算操作符,從基礎(chǔ)的數(shù)學(xué)和位運(yùn)算到邏輯和特殊運(yùn)算符,文章旨在深入解析每一種運(yùn)算操作符的工作原理、應(yīng)用場(chǎng)景和注意事項(xiàng),以幫助開發(fā)者編寫更高效、健壯和可讀的Go代碼,</P><P>
    2023-09-09
  • Golang實(shí)現(xiàn)秒讀32GB大文件示例步驟

    Golang實(shí)現(xiàn)秒讀32GB大文件示例步驟

    這篇文章主要為大家介紹了Golang實(shí)現(xiàn)秒讀32GB大文件的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Golang爬蟲框架 colly的使用

    Golang爬蟲框架 colly的使用

    本文主要介紹了Golang爬蟲框架 colly的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 一文詳解Go語言中的Defer機(jī)制

    一文詳解Go語言中的Defer機(jī)制

    在Go語言中,defer是一個(gè)關(guān)鍵字,用于確保資源的清理和釋放,特別是在函數(shù)中創(chuàng)建的資源,下面就跟隨小編一起來了解下Defer機(jī)制的具體使用吧
    2024-11-11
  • 深入理解golang中io.Writer接口的使用

    深入理解golang中io.Writer接口的使用

    io 是一個(gè) Golang 標(biāo)準(zhǔn)庫(kù)包,它為圍繞輸入和輸出的許多操作和用例定義了靈活的接口,這篇文章主要為大家介紹了Go中Writer接口的使用,需要的可以參考下
    2023-10-10
  • 淺析Go語言中閉包的使用

    淺析Go語言中閉包的使用

    閉包是一個(gè)函數(shù)和其相關(guān)的引用環(huán)境組合的一個(gè)整體。本文主要為大家介紹一下Go語言中閉包的使用,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Go語言有一定幫助,需要的可以參考一下
    2022-12-12
  • go語言time.After()的作用

    go語言time.After()的作用

    time.After 是 Go 語言中的一個(gè)函數(shù),用于返回一個(gè)定時(shí)器通道,該通道在指定時(shí)間后發(fā)送當(dāng)前時(shí)間,這個(gè)功能常用于超時(shí)控制和延遲執(zhí)行,本文就來詳細(xì)的介紹一下,感興趣的可以了解學(xué)習(xí)
    2024-10-10

最新評(píng)論

甘肃省| 东光县| 万宁市| 蓝田县| 淅川县| 塘沽区| 乌兰浩特市| 静宁县| 湘阴县| 镇原县| 北宁市| 贵溪市| 兴宁市| 新营市| 庆云县| 滕州市| 楚雄市| 贵德县| 潞西市| 江安县| 临邑县| 台安县| 历史| 盐津县| 兴海县| 南阳市| 梅河口市| 长岛县| 介休市| 资源县| 集贤县| 六盘水市| 武穴市| 鱼台县| 乐平市| 庆元县| 焉耆| 中西区| 台山市| 宽城| 南丰县|