枚举类型是一种常用的数据类型,用于表示一组有限的、预定义的、具名的常量值。在枚举类型中,每个常量都是一个枚举值,它们之间的值相等且唯一。

枚举类型通常用于表示一组相关的常量,比如星期、月份、性别等等。在其他语言里(比如 JavaC),都内置了枚举类型,而在 Go 语言里是没有内置枚举类型的,因此我们需要采用其他方式实现类似的枚举类型功能,本文将介绍如何实现 “枚举类型”。

Go 语言中的 “枚举类型”

枚举类型的值本质上是常量,因此我们可以使用 Go 语言中的常量来实现类似枚举类型的功能,例如:

 
go

 
const (
Sunday = 1
Tuesday = 2
Wednesday = 3
Thursday = 4
Friday = 5
Saturday = 6
Monday = 7
)

在这个例子中,我们使用了 const 关键字定义了一组常量,其中每个常量的名称代表着一个枚举,其值为对应的整数。

虽然这个例子能实现类似的枚举类型,但它不具备枚举类型的所有特征,例如缺少安全性和约束性,为了解决这两个问题,我们可以使用自定义类型进行改进:

 
go

 
type WeekDay int

const (
Sunday WeekDay = 1
Tuesday WeekDay = 2
Wednesday WeekDay = 3
Thursday WeekDay = 4
Friday WeekDay = 5
Saturday WeekDay = 6
Monday WeekDay = 7
)

在改进后的例子中,我们定义了一个自定义类型 Weekday,用于表示星期几。使用 const 关键字定义一个常量组,其中每个常量都被赋予了一个具体的值,同时使用 Weekday 类型进行类型约束和类型检查。这样,我们就可以通过枚举值的名称来表示某个特定的星期几,并且由于使用了自定义类型,编译器可以进行类型检查,从而提高了类型安全性。

使用 iota 优雅实现枚举

通过前面的例子不难发现,当我们需要定义多个枚举值时,手动指定每个枚举常量的值会变得十分麻烦。为了解决这个问题,我们可以使用 iota 常量生成器,它可以帮助我们生成连续的整数值。

例如,使用 iota 定义一个星期几的枚举类型:

 
go

 
type WeekDay int

const (
Sunday WeekDay = iota
Tuesday
Wednesday
Thursday
Friday
Saturday
Monday
)

在这个例子中,我们使用 iota 自增常量生成器来定义了一个星期几的枚举类型,每个枚举值都是一个 Weekday 类型的常量。由于 iota 的自增规则,每个枚举值的值将自动递增,从而生成一系列连续的整数值。

为自定义的枚举添加方法

 
go

 
type WeekDay int

const (
Sunday WeekDay = iota
Tuesday
Wednesday
Thursday
Friday
Saturday
Monday
)

为了能让我们实现的 “枚举类型” 更加具备枚举类型的特征,我们可以为其添加类似 Java 等其他语言中的枚举方法。

Name()

返回枚举值的名称。

 
go

 
// Name 返回枚举值的名称
func (w WeekDay) Name() string {
if w < Sunday || w > Monday {
return "Unknown"
}
return [...]string{"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"}[w]
}

Original

返回枚举值在枚举类型中的位置。

 
go

 
// Original 由于这个枚举类型的枚举值本质上是整数常量,因此我们可以直接使用枚举值作为它的序号
func (w WeekDay) Original() int {
return int(w)
}

String()

实现 String 方法,用于打印输出。

 
go

复制代码
// 将枚举值转成字符串,便于输出
func (w WeekDay) String() string {
return w.Name()
}

Values()

返回一个包含所有枚举值的切片。

 
go

 
// Values 返回一个包含所有枚举值的切片
func Values() []WeekDay {
return []WeekDay{Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday}
}

ValueOf()

根据名称返回对应的枚举值。

 
go

 
// ValueOf 使用 switch 语句来根据名称返回对应的枚举值
func ValueOf(name string) (WeekDay, error) {
switch name {
case "Sunday":
return Sunday, nil
case "Monday":
return Monday, nil
case "Tuesday":
return Tuesday, nil
case "Wednesday":
return Wednesday, nil
case "Thursday":
return Thursday, nil
case "Friday":
return Friday, nil
case "Saturday":
return Saturday, nil
default:
return 0, fmt.Errorf("invalid WeekDay name: %s", name)
}
}

golang之枚举类型iota的更多相关文章

  1. golang枚举类型 - iota用法拾遗

    在c#.java等高级语言中,经常会用到枚举类型来表示状态等.在golang中并没有枚举类型,如何实现枚举呢?首先从枚举的概念入手. 1.枚举类型定义 从百度百科查询解释如下:http://baike ...

  2. 04_枚举类型iota

    iota是枚举类型的关键字,使用iota可以方便快捷的给常量赋值,主要体现在以下几个方面:1.iota常量自动生成器,每个一行加12.iota给常量赋值使用3.iota遇到const重置为04.可以写 ...

  3. Go常量与枚举类型

    package main import ( "math" "fmt" ) //常量与枚举 //const数值可作为各种类型使用 func consts() { ...

  4. go常量的定义和枚举类型

    const a,b int = 1,2 const a,b     = 1,2 const ( a = "hello" b,c =3,4 ) 常量数值可作为各种类型使用 枚举类型的 ...

  5. Asp.Net 将枚举类型(enum)绑定到ListControl(DropDownList)控件

    在开发过程中一些状态的表示使用到枚举类型,那么如何将枚举类型直接绑定到ListControl(DropDownList)是本次的主题,废话不多说了,直接代码: 首先看工具类代码: /// <su ...

  6. 第三条:用私有构造器或者枚举类型强化Singleton属性

    1.使用单元素的枚举类型 public enum Singleton implements Serializable { INSTANCE; private String field; public ...

  7. 在WPF中使用变通方法实现枚举类型的XAML绑定

    问题缘起 WPF的分层结构为编程带来了极大便利,XAML绑定是其最主要的特征.在使用绑定的过程中,大家都普遍的发现枚举成员的绑定是个问题.一般来说,枚举绑定多出现于与ComboBox配合的情况,此时我 ...

  8. 窥探Swift之别样的枚举类型

    想必写过程序的童鞋对枚举类型并不陌生吧,使用枚举类型的好处是多多的,在这儿就不做过多的赘述了.Fundation框架和UIKit中的枚举更是数不胜数,枚举可以使你的代码更易阅读并且可以提高可维护性.在 ...

  9. C#枚举类型的常用操作总结

    枚举类型是定义了一组"符号名称/值"配对.枚举类型是强类型的.每个枚举类型都是从system.Enum派生,又从system.ValueType派生,而system.ValueTy ...

  10. TypeScript中的枚举类型

    TypeScript拓展了Javascript原生的标准数据类型集,增加了枚举类型(enmu)和其他语言一 样 它提供我们一种数字类型的值,用来设置由于辨别的名字和方法 enum Students { ...

随机推荐

  1. 淘宝订单信息获取接口API,淘宝打单发货接口

    从事电商软件开发的小伙伴,在日常开发任务中,经常会遇到一个需求,就是将淘宝店铺的订单,同步到自己的内部订单管理系统OMS中,进行淘宝打单发货操作.我介绍下如何将订单同步下来,供各位参考.(注意:所有电 ...

  2. TypeScript – Get Started Advanced (Work with SystemJS)

    更新 我本来想 skip 掉 bundler (webpack), 感觉单侧不需要搞那么复杂, 所以用了 TypeScript 自带的 bundle (outFile) + SystemJS. 谁知道 ...

  3. Git 基本配置与常用命令

    使用Git会用到一些基本的Linux命令,比如: ls/ll   查看当前目录 cat   查看文件内容 touch   创建文件 vi   vi编辑器(使用vi编辑器方便展示效果) 安装成功 右击桌 ...

  4. kaggle入门 随机森林求解Titanic

    # kaggle Titanic # 导入需要的库 import pandas as pd import numpy as np import sys import sklearn import ra ...

  5. Adobe Acrobat XI Pro 合并多个PDF文件时弹出Flash提示

    事件起因: 某知名同事在使用 Acrobat XI Pro 软件合并多个PDF文件时弹出Flash提示报错,需要安装 FlashPlayer   解决办法: 合并文件的时候右上角选项-文件类型,选择& ...

  6. Qt构建cmake工程方法总结

    由于工作需要,最近打算统一将所有C/C++项目都改成使用cmake编译.传统后台业务问题不大,但是有些牵涉到跨平台的Qt项目还是折腾了一阵.下面对这段时间的收获做一个总结,也希望帮助看到本文的朋友少走 ...

  7. std::make_shared

    std::make_shared 是 C++11 引入的一个标准库函数,用于创建一个 std::shared_ptr,并在堆上分配所需的对象. 它的功能是将对象的创建和 shared_ptr 的初始化 ...

  8. springboot的启动类必须和controller在同一层级

    springboot的启动类必须和controller在同一层级

  9. 点亮PC13- 使用寄存器点亮

    #include "stm32f10x.h" // Device header int main(void) { // 打卡GPIOC的时钟 RCC->APB2ENR = 0 ...

  10. url 统一资源定位符的组成

    协议 protocol :http 或者 https = http + ssl  或者 file 文件(本地): 域名 host 或 ip 地址: 端口 port 省略默认 80  : 路径 path ...