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

    文章

    3398

    浏览量

    42688
  • 枚举
    +关注

    关注

    0

    文章

    16

    浏览量

    4617
  • go语言
    +关注

    关注

    1

    文章

    158

    浏览量

    9086

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

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

收藏 人收藏

    评论

    相关推荐

    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和内联构造

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

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

    Java 枚举与策略模式、函数式接口的结合:实现高内聚低耦合的设计

    作者:京东物流 杨唯一 一、Java 枚举类 Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一年的 12 个月份,一个星期的 7 天,方向有东南西北等。 我们在业务需求开发
    的头像 发表于 11-21 14:06 278次阅读

    在学习go语言的过程踩过的坑

    作为一个5年的phper,这两年公司和个人都在顺应技术趋势,新项目慢慢从php转向了go语言,从2021年到现在,笔者手上也先后开发了两个go项目。在学习go
    的头像 发表于 11-11 09:22 197次阅读

    go语言如何解决并发问题

    作为一个后端开发,日常工作中接触最多的两门语言就是PHP和GO了。无可否认,PHP确实是最好的语言(手动狗头哈哈),写起来真的很舒爽,没有任何心智负担,字符串和整型压根就不用区分,开发速度真的是比
    的头像 发表于 10-23 13:38 173次阅读
    <b class='flag-5'>go</b><b class='flag-5'>语言</b>如何解决并发问题

    三十分钟入门基础Go Java小子版

    前言 Go语言定义 Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态、强类型、编译型
    的头像 发表于 08-12 14:32 779次阅读
    三十分钟入门基础<b class='flag-5'>Go</b> Java小子版

    技术干货驿站 ▏深入理解C语言:基本数据类型和变量

    在C语言中,数据类型和变量是编程的基础,也是理解更复杂概念的关键。数据类型决定了变量的内存分配、存储范围和操作方式,而变量则是存储数据的容器。本篇文章将从基本数据类型和变量两个方面,带
    的头像 发表于 07-26 17:53 2264次阅读
    技术干货驿站 ▏深入理解C<b class='flag-5'>语言</b>:基本数据<b class='flag-5'>类型</b>和变量

    请问STVP+COSMIC环境下的go to definition怎么

    STVP+COSMIC环境下的go to definition怎么? 我现在go to definition在一个宏定义的时候有效果,但是函数什么的没用,是怎么回事呢,是不是工程里面没有设置好,求大家帮帮忙?
    发表于 05-11 06:11

    关于go中接口类型的表示方法

    go是一个静态性语言,每个变量都有静态的类型,因此每个变量在编译阶段中有明确的变量类型,比如像:int、float32、MyType。
    的头像 发表于 04-28 10:13 405次阅读

    请问STVD +COSMIC里面不能使用枚举类型吗?

    enumeration member 在定义枚举类型的位置 typedef enum Gpio_Type { ST_TYPE_DI = 0, ST_TYPE_DO, ST_TYPE_AI, }GPIO_TYPE; 使用的是STVD +COSMIC
    发表于 04-28 08:08

    Go语言中的函数、方法与接口详解

    Go 没有类,不过可以为结构体类型定义方法。方法就是一类带特殊的接收者参数的函数。方法接收者在它自己的参数列表内,位于 func 关键字和方法名之间。(非结构体类型也可以定义方法)
    的头像 发表于 04-23 16:21 908次阅读

    C语言数据类型有哪些

    在 C 语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式。
    发表于 03-20 10:56 513次阅读
    C<b class='flag-5'>语言</b>数据<b class='flag-5'>类型</b>有哪些

    char是有符号类型还是无符号类型

    看一个C语言的笔试题,题目很简单,问char是有符号类型还是无符号类型
    的头像 发表于 03-17 10:15 1310次阅读

    fpga的是什么编程语言 fpga什么语言开发

    fpga的是什么编程语言 FPGA(现场可编程逻辑门阵列)主要使用的编程语言是硬件描述语言(HDL)。在众多的HDL中,Verilog HDL和VHDL是最常用的两种。 Verilo
    的头像 发表于 03-14 17:09 3627次阅读

    cyusb3014枚举的工作原理是什么?如果下载固件后不枚举,可能会是什么原因,原理是什么?

    3014设计自己的板子,参考开发板kit3的原理图,插入计算机后可以被识别为Bootloader,采用USB启动模式,下载实例中的固件后,显示烧写成功,但设备在计算机中消失了,不再重新被枚举。我
    发表于 02-29 07:11