我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Go项目怎么使用枚举

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Go项目怎么使用枚举

前言

哈喽,大家好,我是asong。枚举是一种很重要的数据类型,在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型数字并不知道其具体含义

于是乎我们就想到用常量字符来表示,代码就变成了这样:

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

这样也同样存在问题,因为我们使用的常量字符,那么有些程序猿不按套路出牌就可以使用字符串的值进行比较,这样的代码会被不断模仿变得越来越多的,然后屎山就出现了;

所以我们迫切需要枚举类型的出现来起到约束的作用,假设使用一个枚举类型做入参,枚举类型就可以限定沙雕用户不按套路传参,这样就可以怼他了,哈哈~;

使用枚举的代码就可以变成这样,传了枚举之外的类型都不可以了;

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语言就没有枚举类型,我们该使用什么方法来替代呢?

定义新类型实现枚举

枚举通常是一组相关的常量集合,Go语言中有提供常量类型,所以我们可以使用常量来声明枚举,但也同样会遇到上述的问题,起不到约束的作用,所以为了起到约束我们可以使用Go语言另外一个知识点 -- 类型定义,Go语言中可以使用type关键字定义不同的类型,我们可以为整型、浮点型、字符型等定义新的类型,新的类型与原类型转换需要显式转换,这样在一定程度上也起到了约束的作用,我们就可以用Go语言实现如下枚举:

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

定义新的类型可以起到约束作用,比如我们要检查状态机,入参限定了必须是OrderStatus类型,如果是int类型就会报错。

上面我们的枚举实现方式只能获取枚举值,获取不到其映射的字面意思,所以我们可以优化一下,实现String方法,使用官方提供的cmd/string来快速实现,代码如下:

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

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

执行命令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会生成对应的枚举代码,我们发现其中也是使用定义新的类型的方式来实现的,然后在封装一些方法,我们来赏析一下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
}

总结

虽然Go语言没有提供枚举类型,但是我们也可以根据Go语言的两个特性:常量和定义新类型来实现枚举,方法总比困难多吗,开源库是优秀的,我们往往可以从高手那里里学习很多,记住,请永远保持一个学徒之心;

到此这篇关于Go项目怎么使用枚举的文章就介绍到这了,更多相关Go 枚举内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Go项目怎么使用枚举

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

枚举如何在java项目中使用

今天就跟大家聊聊有关枚举如何在java项目中使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、枚举类型作为常量package myenum; /** * @author zzl
2023-05-31

C#枚举和枚举成员怎么使用

这篇文章主要讲解了“C#枚举和枚举成员怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#枚举和枚举成员怎么使用”吧!C#枚举类型是一种的值类型,它用于声明一组命名的常数。(1)C#枚
2023-06-17

Go中怎么正确使用对枚举

本篇内容主要讲解“Go中怎么正确使用对枚举”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Go中怎么正确使用对枚举”吧!枚举是强类型编程语言中的一种类型,由一组名称和值组成。通常用来在编程语言中充
2023-06-15

如何正确的在C#项目中使用枚举

本篇文章给大家分享的是有关如何正确的在C#项目中使用枚举,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。枚举基础枚举类型的作用是限制其变量只能从有限的选项中取值,这些选项(枚举类
2023-06-06

go枚举的使用方法是什么

在Go语言中,枚举可以通过const关键字定义常量组来实现。虽然Go语言本身并没有枚举类型,但可以使用常量组来达到枚举的效果。下面是一个使用常量组实现枚举的示例代码:package mainimport "fmt"const (Sund
go枚举的使用方法是什么
2024-03-06

c语言枚举怎么使用

枚举是一种定义常量集合的数据类型,从 0 开始自增量。其使用步骤如下:定义枚举类型:enum 枚举类型名 { 常量1, 常量2, ...};声明枚举变量:enum 枚举类型名 变量名;赋值:变量名 = 常量。枚举的优点包括提高代码可读性、防
c语言枚举怎么使用
2024-05-21

go枚举的作用是什么

在Go语言中,枚举(Enumeration)可以通过一组常量的集合来定义一种新的类型,枚举类型可以有固定的取值范围,这样可以增强代码的可读性和可维护性。枚举类型的定义类似于常量的定义,只不过在枚举类型中可以使用iota来自动生成连续的值。
go枚举的作用是什么
2024-03-06

C#枚举类型怎么使用

本篇内容介绍了“C#枚举类型怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!C#枚举,枚举是一种值类型,由许多名字的常量(也叫枚举表)
2023-06-17

在Python中怎么使用枚举

这篇文章主要为大家展示了“在Python中怎么使用枚举”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“在Python中怎么使用枚举”这篇文章吧。在 Python 中使用枚举。我们可以使用以下方法来
2023-06-27

Java中的枚举怎么使用

本篇内容主要讲解“Java中的枚举怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中的枚举怎么使用”吧!枚举(enum)枚举是一个被命名的整型常数的集合,用于声明一组带标识符的常数
2023-07-05

怎么使用JavaScript编写枚举

本篇内容介绍了“怎么使用JavaScript编写枚举”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言假设有这样一个场景,我们需要统计员工的
2023-07-02

枚举怎么在Java中使用

本篇文章给大家分享的是有关枚举怎么在Java中使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。使用方法如下:package com.ljq.test;/** * 枚举用法详解
2023-05-31

怎么使用MyBatis的枚举类型

在使用MyBatis的枚举类型时,需要按照以下步骤进行操作:创建枚举类:首先需要创建一个枚举类来表示需要使用的枚举类型,比如:public enum Status {ACTIVE,INACTIVE}配置MyBatis类型处理器:在MyBa
怎么使用MyBatis的枚举类型
2024-03-08

Python枚举怎么定义与使用

这篇文章主要介绍了Python枚举怎么定义与使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python枚举怎么定义与使用文章都会有所收获,下面我们一起来看看吧。1. 枚举的定义首先,定义枚举要导入enum模
2023-07-06

mysql枚举类型enum怎么使用

在MySQL中,枚举类型(enum)用于定义一个可以选择的值列表。enum类型可以在创建表时定义,也可以在已存在的表中添加。下面是创建表时定义enum的示例:```sqlCREATE TABLE my_table (id INT,statu
2023-08-30

c++枚举类型enum怎么使用

在C++中,枚举类型(enum)用于定义一组具有离散值的常量。它可以用来提高代码的可读性和可维护性。以下是使用枚举类型的基本语法:```cppenum 枚举类型名 {枚举值1,枚举值2,...};```其中,枚举类型名是你给枚举类型起的名称
2023-10-10

在Java项目中使用枚举类型的方法有哪些

这期内容当中小编将会给大家带来有关在Java项目中使用枚举类型的方法有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 Java枚举类型enum一、 通常定义常量方法我们通常利用public fin
2023-05-31

Python枚举类怎么定义和使用

本篇内容主要讲解“Python枚举类怎么定义和使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python枚举类怎么定义和使用”吧!一些具有特殊含义的类,其实例化对象的个数往往是固定的,比如用
2023-06-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录