0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

go语言枚举类型怎么用

马哥Linux运维 来源:OSC开源社区 作者:OSC开源社区 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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 开源
    +关注

    关注

    3

    文章

    4031

    浏览量

    45548
  • 枚举
    +关注

    关注

    0

    文章

    16

    浏览量

    4817
  • go语言
    +关注

    关注

    1

    文章

    159

    浏览量

    9623

原文标题:Golang 如何表示枚举类型

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    C语言自动类型转换

    一、自动类型转换 数据类型存在自动转换的情况. 自动转换发生在不同数据类型运算时,在编译的时候自动完成。 char类型数据转换为int类型
    发表于 11-25 08:04

    C语言强制类型转换

    强制类型转换是通过定义类型转换运算来实现的。其一般形式为: (数据类型) (表达式) 其作用是把表达式的运算结果强制转换成类型说明符所表示的类型
    发表于 11-24 06:32

    汉思新材料:光模块封装类型及选择要点

    光模块封装类型及选择要点在光模块的制造中,胶水的选择确实关键,它直接影响到产品的性能和长期可靠性。不同工艺环节需要使用不同类型的胶水,以下是
    的头像 发表于 10-30 15:41 259次阅读
    汉思新材料:光模块封装<b class='flag-5'>用</b>胶<b class='flag-5'>类型</b>及选择要点

    【VisionFive 2单板计算机试用体验】3、开源大语言模型部署

    github里的build from source指导,进行编译,编译步骤如下图所示: 在调用go run . serve发现抱错:go指令不存在,这是因为VisionFive2板卡没有安装go,下面我们
    发表于 07-19 15:45

    定义IO初始化结构体

    由上述IOPORT相关功能的枚举类型我们可以知道,在对IOPORT模块进行初始化时需要根据情况配置它们。因此我们定义一个IOPORT初始化的结构体类型IOPORT_Init_t,它的成员包括了由上述所有
    的头像 发表于 07-16 16:26 1100次阅读

    自签名证书工具cfssl详解

    CFSSL(CloudFlare's PKI and TLS toolkit)由 CloudFlare go语言开发的一个开源工具,用于证书签名、验证和管理。
    的头像 发表于 06-11 16:30 530次阅读
    自签名证书工具cfssl详解

    如何重新启动 FX3S 的枚举过程?

    。 然而,我面临的一个问题是,如果 FX3S 最初没有连接到 USB 3.0 电缆和 PC,它就不会重新启动枚举过程。 在这种情况下,有人能指导我如何重新启动 FX3S 的枚举过程吗? 或者如果 USB 速度不是超高速,如何在 10 秒后重新启动
    发表于 05-19 07:34

    从 Java 到 Go:面向对象的巨人与云原生的轻骑兵

    Go 语言在 2009 年被 Google 推出,在创建之初便明确提出了“少即是多(Less is more)”的设计原则,强调“以工程效率为核心,极简规则解决复杂问题”。它与 Java
    的头像 发表于 04-25 11:13 504次阅读

    MATLAB或者C语言开发FPGA有什么问题吗

    最近有个项目领导要求MATLAB开发FPGA,有大佬MATLAB或者C语言开发FPGA的吗,有没有什么问题,需要注意什么问题吗
    发表于 01-26 09:57

    典范转移 EV全生态系商机 - The CAN SIC Transceiver Is Ready To Go.

    典范转移 EV全生态系商机 - The CAN SIC Transceiver Is Ready To Go.
    的头像 发表于 01-22 17:23 880次阅读
    典范转移 EV全生态系商机 - The CAN SIC Transceiver Is Ready To <b class='flag-5'>Go</b>.

    EE-33:C语言对ADSP-21xx定时器进行编程

    电子发烧友网站提供《EE-33:C语言对ADSP-21xx定时器进行编程.pdf》资料免费下载
    发表于 01-15 15:46 0次下载
    EE-33:<b class='flag-5'>用</b>C<b class='flag-5'>语言</b>对ADSP-21xx定时器进行编程

    EE-32:语言扩展:内存存储类型、ASM和内联构造

    电子发烧友网站提供《EE-32:语言扩展:内存存储类型、ASM和内联构造.pdf》资料免费下载
    发表于 01-14 15:03 0次下载
    EE-32:<b class='flag-5'>语言</b>扩展:内存存储<b class='flag-5'>类型</b>、ASM和内联构造

    gitee 支持的编程语言有哪些

    Gitee 支持的常见编程语言: Python :一种广泛使用的高级编程语言,以其清晰的语法和代码可读性而闻名。 Java :一种面向对象的编程语言,被广泛用于企业级应用开发。 C++ :一种通用的、静态
    的头像 发表于 01-06 09:50 1103次阅读

    压敏电阻有哪些应用类型

    压敏电阻是一种具有非线性伏安特性的电阻器件,主要用于在电路承受过压时进行电压钳位,吸收多余的电流以保护敏感器件。根据使用目的的不同,压敏电阻的应用类型主要可以分为两大类:保护压敏电阻和电路功能
    的头像 发表于 12-30 15:58 1023次阅读
    压敏电阻有哪些应用<b class='flag-5'>类型</b>?

    影目科技发布全球首款同传翻译眼镜INMO GO2

    近日,搭载紫光展锐W517芯片平台的INMO GO2由影目科技正式推出。作为全球首款专为商务场景设计的智能翻译眼镜,INMO GO2 以“快、准、稳”三大核心优势,突破传统翻译产品局限,为全球商务人士带来高效、自然、稳定的跨语言
    的头像 发表于 12-11 10:00 1937次阅读