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

伙計,Go項目怎么使用枚舉?

開發(fā) 前端
雖然Go語言沒有提供枚舉類型,但是我們也可以根據(jù)Go語言的兩個特性:常量和定義新類型來實現(xiàn)枚舉,方法總比困難多嗎?

前言

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

為什么要有枚舉

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

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

使用int類型會存在以下隱患:

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

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

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

這樣也同樣存在問題,因為我們使用的常量字符,那么有些程序猿不按套路出牌就可以使用字符串的值進行比較,這樣的代碼會被不斷模仿變得越來越多的,然后屎山就出現(xiàn)了;

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

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

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語言就沒有枚舉類型,我們該使用什么方法來替代呢?

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

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

type OrderStatus int

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

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

上面的代碼就會報錯:

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

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

上面我們的枚舉實現(xiàn)方式只能獲取枚舉值,獲取不到其映射的字面意思,所以我們可以優(yōu)化一下,實現(xiàn)String方法,使用官方提供的cmd/string來快速實現(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會生成對應的枚舉代碼,我們發(fā)現(xiàn)其中也是使用定義新的類型的方式來實現(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語言的兩個特性:常量和定義新類型來實現(xiàn)枚舉,方法總比困難多嗎,開源庫是優(yōu)秀的,我們往往可以從高手那里里學習很多,記住,請永遠保持一個學徒之心。

責任編輯:武曉燕 來源: Golang夢工廠
相關推薦

2022-04-13 08:20:32

DockerGo項目

2022-05-16 10:58:12

Go 項目Makefilemake

2021-11-29 09:45:57

枚舉Go代碼

2022-06-05 23:30:25

AES加密算法

2022-07-03 23:07:48

Go語言參數(shù)

2024-04-01 00:02:56

Go語言代碼

2022-07-04 14:41:31

Go 語言變長參數(shù)變長參數(shù)函數(shù)

2023-02-13 00:24:37

Go語言日志庫

2021-06-09 07:15:20

Go枚舉技巧

2021-01-20 16:26:17

Go編程語言

2022-02-21 18:16:38

Go語言枚舉

2022-01-17 16:18:14

Go枚舉源碼

2022-11-06 23:17:23

Go語言項目

2023-01-16 00:12:20

Go語言Web

2025-06-09 01:22:00

Go版本管理器

2024-11-06 09:23:32

2022-03-13 23:51:39

Web項目Go

2023-07-16 23:43:05

Go語言模式

2024-08-19 01:10:00

RedisGo代碼

2021-10-26 15:36:17

C++枚舉值類型
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 日韩三级在线观看 | 韩日在线 | 国产综合久久久 | 亚洲欧洲在线观看视频 | 免费一级黄色录像 | 一区二区三区亚洲 | 自拍偷拍第一页 | 精品久久久久久久久久久久久久 | 精品美女久久久 | 一区二区小视频 | 成人一区二区视频 | 亚洲成在线观看 | 欧美日韩中文在线观看 | 欧美日韩国产一区二区三区不卡 | 成人1区| 久久国产精品无码网站 | 久久久久久一区 | 精品一区二区三区在线观看 | 日韩不卡一区二区三区 | 国产一级电影在线 | 9久9久 | 国产精品日韩一区 | 夜夜精品浪潮av一区二区三区 | 一区日韩 | 久久久久久久久中文字幕 | 欧美日韩国产一区二区三区 | 亚洲精品一区在线 | 青草福利 | 成人av电影在线 | 久久久久久99 | 日本国产欧美 | 久久精品性视频 | 日本小电影网站 | 国产精品无码久久久久 | 91精品国产一区二区三区 | 亚洲国产高清在线 | 久久久国产亚洲精品 | 99久久婷婷国产综合精品电影 | 精品国产一区二区三区性色 | 在线国产视频观看 | 欧美日韩国产精品一区二区 |