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

    文章

    2981

    浏览量

    41687
  • 枚举
    +关注

    关注

    0

    文章

    16

    浏览量

    4521
  • go语言
    +关注

    关注

    1

    文章

    156

    浏览量

    8919

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

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

收藏 人收藏

    评论

    相关推荐

    枚举有多大?c语言枚举end的作用是什么?

    枚举有多大?c语言枚举end的作用是什么? 枚举在C语言中是一种常见的数据类型,用于定义一组相互
    的头像 发表于 01-19 14:19 190次阅读

    java switch case值能为枚举值吗

    Java中的switch语句可以接受枚举类型的值作为参数。在Java中,枚举是一种特殊的数据类型,它定义了一个固定数量的命名常量。因此,可以将枚举
    的头像 发表于 11-30 14:41 1543次阅读

    C语言必备知识枚举

    枚举类型是ANSI C新标准所增加的。如果一个变量只有几种可能的值,可以定义为枚举类型。所谓“枚举是指将变量的值一一列举出来,变量的值只限于
    的头像 发表于 11-29 16:07 469次阅读

    如何在Go中给GORM模型添加枚举类型

    GORM是一个流行的Go ORM,它允许我们定义结构体来表示数据库表,并提供一个接口来执行CRUD操作。枚举在编程中是一个有用的特性,它允许我们定义一个变量可以取的固定值集。在这篇文章中,我们将探索如何向GORM模型添加枚举
    的头像 发表于 11-28 15:36 677次阅读

    使用枚举类型表示状态机进入死循环

    在定义状态机中的状态时,除了可以使用宏(define)或者参数(parameter)声明定义外,还可以使用枚举类型
    的头像 发表于 11-07 17:46 585次阅读
    使用<b class='flag-5'>枚举</b><b class='flag-5'>类型</b>表示状态机进入死循环

    Go语言比Python强多少

    1.都说Go语言性能非常强大,那么到底比Python强多少? 为了比较Go语言和Python语言在单线程性能上的差距,我们可以做一个简单实验
    的头像 发表于 11-02 14:05 272次阅读
    <b class='flag-5'>Go</b><b class='flag-5'>语言</b>比Python强多少

    Java枚举的特点及用法

    在 Java 枚举出现之前,通常会使用常量类来表示一组固定的常量值,直到Java 1.5之后推出了枚举,那么枚举类型有哪些特点,它比常量类又好在哪里呢。 本文将分析一下
    的头像 发表于 09-30 10:02 402次阅读

    C语言枚举的基本概念和常见用法

    在C语言中,枚举是一种方便组织和表示一组相关常量的工具。枚举类型有助于提高代码的可读性和可维护性。本文将介绍C语言
    发表于 08-17 15:32 758次阅读

    Go语言中的整数类型

    Go 语言中,整型可以细分成两个种类十个类型
    发表于 07-20 15:25 330次阅读

    Go语言常量的声明

    Go 语言中, 常量 表示的是固定的值,常量表达式的值在编译期进行计算,常量的值不可以修改。例如:3 、 Let's go 、 3.14 等等。常量中的数据类型只可以是
    发表于 07-20 15:24 272次阅读

    Go语言简介和安装方法

    Go 又称 Golang ,是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言Go
    发表于 07-19 16:33 408次阅读

    详解C/C++结构体、联合体和枚举的区别与内存对齐

    C语言中构造类型一共有4种,它们分别是数组、结构体(struct)、共用体(union)、枚举类型(enum)。
    的头像 发表于 06-08 14:38 1668次阅读
    详解C/C++结构体、联合体和<b class='flag-5'>枚举</b>的区别与内存对齐

    浅谈SylixOS 实时操作系统中Go语言应用

    Go 语言是一门编译型语言,继承了编译型语言的高性能、类型安全以及对计算机底层的高可控性等特点,其运行性能可与C/C++媲美。
    发表于 06-08 10:41 771次阅读
    浅谈SylixOS 实时操作系统中<b class='flag-5'>Go</b><b class='flag-5'>语言</b>应用

    枚举类型的简单扩展学习

    定义枚举类型的值只能是整型常量,正数、负数和零都可以,但不可以是浮点数
    的头像 发表于 05-25 15:45 448次阅读

    一个文档把Go语言所有核心知识点撸全了

    Go语言的主要特征、Golang内置类型和函数、lnit函数和main函数、命令、运算符、下划线、变量和常量、基本类型、数组Array、切片Slice、指针、Map、架构体
    的头像 发表于 05-10 10:05 800次阅读
    一个文档把<b class='flag-5'>Go</b><b class='flag-5'>语言</b>所有核心知识点撸全了