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

    文章

    4368

    浏览量

    46459
  • 枚举
    +关注

    关注

    0

    文章

    16

    浏览量

    4881
  • go语言
    +关注

    关注

    1

    文章

    159

    浏览量

    9851

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    基于凌羽派的OpenHarmony北向应用开发:ArkTS语法-数据类型和变量声明

    将创建包含三个元素的数组: let names: string[] = [\'Alice\', \'Bob\', \'Carol\']; 2.4.7 enum类型 enum类型,即枚举类型
    发表于 02-26 14:24

    数字万表的类型、原理与应用

    功能于一体,具备高精度、高稳定性与操作便捷等优势,广泛应用于电路调试、设备维护、教学实验及工业自动化等领域。本文将系统介绍数字万表的主要类型、工作原理、功能特点及其在实际应用中的关键作用。   一、数字万表的主要
    的头像 发表于 02-24 15:13 345次阅读
    数字万<b class='flag-5'>用</b>表的<b class='flag-5'>类型</b>、原理与应用

    Go 语言高并发服务设计与性能调优实战:从万级到百万级并发的演进之路

    在2026年的今天,Go 语言已成为高并发后端服务的首选语言。根据 Stack Overflow 最新开发者调查: 指标 数据 Go 语言
    发表于 02-18 19:19

    C语言主要特点

    指针类型数据,使用十分灵活和多样化,能用来实现各种复杂的数据结构(如链表、树、栈等)的运算。 4.具有结构化的控制语句。函数作为程序的模块单位,便于实现程序的模块化。C语言是完全模块化和结构化的
    发表于 01-05 07:41

    低成本TLI4971/TLE4971电流传感器评估套件——MS2Go与S2Go

    低成本TLI4971/TLE4971电流传感器评估套件——MS2Go与S2Go 在电子工程师的日常工作中,电流传感器的评估和应用是一个重要的环节。今天我们要介绍的是英飞凌(Infineon
    的头像 发表于 12-19 16:50 1203次阅读

    探索TLE493D-P3XX-MS2GO 3D 2Go套件:开启3D磁传感器评估之旅

    探索TLE493D-P3XX-MS2GO 3D 2Go套件:开启3D磁传感器评估之旅 在电子工程师的日常工作中,评估和开发磁传感器是一项常见且重要的任务。英飞凌(Infineon
    的头像 发表于 12-18 17:15 1349次阅读

    枚举类型的讲解

    枚举是一个基本的数据类型,它可以让数据更简洁。 如果写一个判断星期的文章,我们当然可以使用宏定义来使代码更加易懂,不过: #define MON 1 #define TUE 2
    发表于 12-08 08:14

    C语言自动类型转换

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

    C语言强制类型转换

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

    Linux 编程语言盘点:从内核到AI的全栈选择

    在工控圈和嵌入式圈里,有一个常年被讨论的问题:  “在 Linux 上,到底该用什么语言编程?” 有人坚信:C 才是真正的工业语言。有人反驳:Python 才是效率王者。还有人推崇 Go、Rust
    的头像 发表于 11-06 17:05 794次阅读

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

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

    自签名证书工具cfssl详解

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

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

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