golang之枚举类型iota
枚举类型是一种常用的数据类型,用于表示一组有限的、预定义的、具名的常量值。在枚举类型中,每个常量都是一个枚举值,它们之间的值相等且唯一。
枚举类型通常用于表示一组相关的常量,比如星期、月份、性别等等。在其他语言里(比如 Java 和 C),都内置了枚举类型,而在 Go 语言里是没有内置枚举类型的,因此我们需要采用其他方式实现类似的枚举类型功能,本文将介绍如何实现 “枚举类型”。
Go 语言中的 “枚举类型”
枚举类型的值本质上是常量,因此我们可以使用 Go 语言中的常量来实现类似枚举类型的功能,例如:
const (
Sunday = 1
Tuesday = 2
Wednesday = 3
Thursday = 4
Friday = 5
Saturday = 6
Monday = 7
)
在这个例子中,我们使用了 const 关键字定义了一组常量,其中每个常量的名称代表着一个枚举,其值为对应的整数。
虽然这个例子能实现类似的枚举类型,但它不具备枚举类型的所有特征,例如缺少安全性和约束性,为了解决这两个问题,我们可以使用自定义类型进行改进:
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 定义一个星期几的枚举类型:
type WeekDay int
const (
Sunday WeekDay = iota
Tuesday
Wednesday
Thursday
Friday
Saturday
Monday
)
在这个例子中,我们使用 iota 自增常量生成器来定义了一个星期几的枚举类型,每个枚举值都是一个 Weekday 类型的常量。由于 iota 的自增规则,每个枚举值的值将自动递增,从而生成一系列连续的整数值。
为自定义的枚举添加方法
type WeekDay int
const (
Sunday WeekDay = iota
Tuesday
Wednesday
Thursday
Friday
Saturday
Monday
)
为了能让我们实现的 “枚举类型” 更加具备枚举类型的特征,我们可以为其添加类似 Java 等其他语言中的枚举方法。
Name()
返回枚举值的名称。
// Name 返回枚举值的名称
func (w WeekDay) Name() string {
if w < Sunday || w > Monday {
return "Unknown"
}
return [...]string{"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"}[w]
}
Original
返回枚举值在枚举类型中的位置。
// Original 由于这个枚举类型的枚举值本质上是整数常量,因此我们可以直接使用枚举值作为它的序号
func (w WeekDay) Original() int {
return int(w)
}
String()
实现 String 方法,用于打印输出。
// 将枚举值转成字符串,便于输出
func (w WeekDay) String() string {
return w.Name()
}
Values()
返回一个包含所有枚举值的切片。
// Values 返回一个包含所有枚举值的切片
func Values() []WeekDay {
return []WeekDay{Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday}
}
ValueOf()
根据名称返回对应的枚举值。
// 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的更多相关文章
- golang枚举类型 - iota用法拾遗
在c#.java等高级语言中,经常会用到枚举类型来表示状态等.在golang中并没有枚举类型,如何实现枚举呢?首先从枚举的概念入手. 1.枚举类型定义 从百度百科查询解释如下:http://baike ...
- 04_枚举类型iota
iota是枚举类型的关键字,使用iota可以方便快捷的给常量赋值,主要体现在以下几个方面:1.iota常量自动生成器,每个一行加12.iota给常量赋值使用3.iota遇到const重置为04.可以写 ...
- Go常量与枚举类型
package main import ( "math" "fmt" ) //常量与枚举 //const数值可作为各种类型使用 func consts() { ...
- go常量的定义和枚举类型
const a,b int = 1,2 const a,b = 1,2 const ( a = "hello" b,c =3,4 ) 常量数值可作为各种类型使用 枚举类型的 ...
- Asp.Net 将枚举类型(enum)绑定到ListControl(DropDownList)控件
在开发过程中一些状态的表示使用到枚举类型,那么如何将枚举类型直接绑定到ListControl(DropDownList)是本次的主题,废话不多说了,直接代码: 首先看工具类代码: /// <su ...
- 第三条:用私有构造器或者枚举类型强化Singleton属性
1.使用单元素的枚举类型 public enum Singleton implements Serializable { INSTANCE; private String field; public ...
- 在WPF中使用变通方法实现枚举类型的XAML绑定
问题缘起 WPF的分层结构为编程带来了极大便利,XAML绑定是其最主要的特征.在使用绑定的过程中,大家都普遍的发现枚举成员的绑定是个问题.一般来说,枚举绑定多出现于与ComboBox配合的情况,此时我 ...
- 窥探Swift之别样的枚举类型
想必写过程序的童鞋对枚举类型并不陌生吧,使用枚举类型的好处是多多的,在这儿就不做过多的赘述了.Fundation框架和UIKit中的枚举更是数不胜数,枚举可以使你的代码更易阅读并且可以提高可维护性.在 ...
- C#枚举类型的常用操作总结
枚举类型是定义了一组"符号名称/值"配对.枚举类型是强类型的.每个枚举类型都是从system.Enum派生,又从system.ValueType派生,而system.ValueTy ...
- TypeScript中的枚举类型
TypeScript拓展了Javascript原生的标准数据类型集,增加了枚举类型(enmu)和其他语言一 样 它提供我们一种数字类型的值,用来设置由于辨别的名字和方法 enum Students { ...
随机推荐
- OData – Get Started 搭建单侧环境
前言 之前写过 EF Core – Get Started 搭建单侧环境, 这篇补上一个 WebApi + EF Core + OData 创建项目 dotnet new webapi -o EfCo ...
- JavaScript——案例-表单验证
需求 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- PMP——如何区分赶工与快速跟进?
如何区分赶工与快速跟进? 在PMP考试中经常出现由于时间不够需要进行进度压缩的场景.进度压缩的常用工具有赶工和快速跟进两种方式.也可以辅助调整某些活动的提前量与滞后量来进行缓解.提前量是相对于紧前活动 ...
- Task 笔记
1.计时器类Stopwatch Stopwatch stopwatch=new Stopwatch() stopwatch.Start();//开始计时 stopwatch.Stop();//停止计时 ...
- Linux运行脚本./XXXsh: line 1: $‘\r‘: command not found问题
Linux运行脚本./XXXsh: line 1: $'\r': command not found问题 在执行./xxx.sh命令时,系统报错: ./xxx.sh: line 1: $'\r': ...
- 2. 解释器与PyCharm安装
1. 解释器安装 官网 选择解释器版本 建议选择比最新版本低2~3个版本,当前选择3.10 添加到环境变量,如不勾选后续可手动配置 安装完成后已将解释器安装路径自动添加到环境变量中 将解释器安装路径添 ...
- std::stod:“123.456”-> 123.456
std::stod 是 C++ 标准库中一个用于将字符串转换为 double 类型的函数.它属于 <string> 头文件中的函数,通常用于将包含数字的字符串转换为相应的浮点数值. 函数原 ...
- linux kernel 中tracing buffer
Linux内核的tracing buffer是一种用于存储内核跟踪数据的特殊缓冲区.它用于记录内核中发生的事件和活动,以帮助开发人员进行性能分析和故障排查.该缓冲区可以在内核运行时启用,并且可以通过特 ...
- 墨天轮访谈 | 腾讯张铭:带你揭秘王者荣耀背后的游戏数据库 TcaplusDB
分享嘉宾:张铭 腾讯数据库专家工程师,TcaplusDB产品负责人 整理:墨天轮社区 导读 大家好,我是腾讯TcaplusDB的产品负责人张铭,TcaplusDB是专为游戏设计的分布式 NoSQL 数 ...
- Android复习(一)基础知识
1. 现在可以使用 Kotlin.Java 和 C++ 语言编写 Android 应用 2.Android四大组件依然坚挺,这是基础并且没有改变的迹象 Activity 服务 广播接收器 内容提供程序 ...