返回顶部
首页 > 资讯 > 精选 >iota在Go中的使用方法
  • 178
分享到

iota在Go中的使用方法

2023-06-14 22:06:48 178人浏览 泡泡鱼
摘要

这篇文章将为大家详细讲解有关iota在Go中的使用方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。go是什么golang是一种编译语言,可以将代码编译为机器代码,编译后的二进制文件可以直接部署到目标机器

这篇文章将为大家详细讲解有关iota在Go中的使用方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

go是什么

golang是一种编译语言,可以将代码编译为机器代码,编译后的二进制文件可以直接部署到目标机器而无需额外的依赖,所以golang的性能优于其他的解释性语言,且可以在golang中使用goroutine来实现并发性,它提供了一个非常优雅的goroutine调度程序系统,可以很容易地生成数百万个goroutine。

介绍

Go 语言实际上没有直接支持枚举的关键字。一般我们都是通过 const + iota 实现枚举的能力。

有人要问了,为什么一定要使用枚举呢?stackoverflow 上有一个高赞的回答,如下:

You should always use enums when a variable (especially a method parameter) can only take one out of a small set of possible values. Examples would be things like type constants (contract status: “permanent”, “temp”, “apprentice”), or flags (“execute now”, “defer execution”). If you use enums instead of integers (or String codes), you increase compile-time checking and avoid errors from passing in invalid constants, and you document which values are legal to use.BTW, overuse of enums might mean that your methods do too much (it’s often better to have several separate methods, rather than one method that takes several flags which modify what it does), but if you have to use flags or type codes, enums are the way to go.

简单翻译一下, 两点很重要。

  • 当一个变量(尤其是方法参数) 只能从一小部分可能的值中取出一个时,理应使用枚举。
    例如类型常量(合同状态:永久、临时工、学徒), 或者在做任务程序时,是立即执行还是延迟执行的标记。

  • 如果使用枚举而不是整形,则会增加编译时的检查,避免错误无效值的传入,记录哪些值是合法使用的。

如何实现枚举

iota 是 Go 中预声明的一个特殊常量。它会被预声明为0,但是它的值在编译阶段并非是固定的,当预声明的 iota 出现在一个常量声明中的时候,它的值在第n个常量描述中的值为n(从0开始)。所以它只在同类型多个常量声明的情况下才显得有意义。

比如,大家都了解的电商,订单系统一定会涉及到订单状态的流转。那么这时候,我们一般可以这样做:

package mainimport "fmt"type OrderStatus intconst (  Cancelled OrderStatus = iota //订单已取消 0  NoPay OrderStatus = iota //未支付  1  PendIng OrderStatus = iota // 未发货 2  Delivered OrderStatus = iota // 已发货 3  Received OrderStatus = iota // 已收货 4)func main() {  fmt.Println(Cancelled, NoPay) // 打印:0,1}

当然,这样看着好麻烦。其实,其他常量可以重复上一行 iota 表达式,我们可以改成这样。

package mainimport "fmt"type OrderStatus intconst (  Cancelled OrderStatus = iota //订单已取消 0  NoPay //未支付 1  PendIng // 未发货 2  Delivered // 已发货 3  Received // 已收货 4)func main() {  fmt.Println(Cancelled, NoPay) // 打印:0,1}

有人会用 0 的值来表示状态吗?一般都不会,我们想以1开头,那么可以这样。

package mainimport "fmt"type OrderStatus intconst (  Cancelled OrderStatus = iota+1 //订单已取消 1  NoPay //未支付 2  PendIng // 未发货 3  Delivered // 已发货 4  Received // 已收货 5)func main() {  fmt.Println(Cancelled, NoPay) // 打印:1,2}

我们还想在 Delivered 后跳过一个数字,才是 Received 的值,也就是 Received=6,那么可以借助 _ 符号。

package mainimport "fmt"type OrderStatus intconst (  Cancelled OrderStatus = iota+1 //订单已取消 1  NoPay //未支付 2  PendIng // 未发货 3  Delivered // 已发货 4  _ Received // 已收货 6)func main() {  fmt.Println(Received) // 打印:6}

顺着来可以,倒着当然也行。

package mainimport "fmt"type OrderStatus intconst (  Max = 5)const (  Received OrderStatus = Max - iota // 已收货  5  Delivered // 已发货 4  PendIng // 未发货 3  NoPay //未支付 2  Cancelled //订单已取消 1)func main() {  fmt.Println(Received,Delivered) // 打印:5,4}

你还可以使用位运算,比如在 go 源码中的包 sync 中的上面有这么一段代码。

const ( mutexLocked = 1 << iota  //1<<0 mutexWoken               //1<<1 mutexStarving            //1<<2 mutexWaiterShift = iota  //3)func main() { fmt.Println("mutexLocked的值",mutexLocked) //打印:1 fmt.Println("mutexWoken的值",mutexWoken) //打印:2 fmt.Println("mutexStarving的值",mutexStarving) //打印:4 fmt.Println("mutexWaiterShift的值",mutexWaiterShift) // 打印:3}

可能有人平常是直接定义常量值或者用字符串来表示的。

比如,上面这些我完全可以用 string 来表示,我还真见过用字符串来表示订单状态的。

package mainimport "fmt"const (  Cancelled = "cancelled"  NoPay = "noPay"  PendIng = "pendIng"  Delivered = "delivered"  Received = "received")var OrderStatusMsg = map[string]string{  Cancelled: "订单已取消",  NoPay:     "未付款",  PendIng:   "未发货",  Delivered: "已发货",  Received:  "已收货",}func main() {  fmt.Println(OrderStatusMsg[Cancelled])}

或者直接定义整形常量值。

package mainimport "fmt"const (  Cancelled = 1  NoPay = 2  PendIng = 3  Delivered = 4  Received = 5)var OrderStatusMsg = map[int]string{  Cancelled: "订单已取消",  NoPay:     "未付款",  PendIng:   "未发货",  Delivered: "已发货",  Received:  "已收货",}func main() {  fmt.Println(OrderStatusMsg[Cancelled])}

其实上述两种都可以,但是相比之下使用 iota 更有优势。

  • 能保证一组常量的唯一性,人工定义的不能保证。

  • 可以为一组动作分享同一种行为。

  • 避免无效值。

  • 提高代码阅读性以及维护。

延伸

按照上面我们所演示的,最后我们可以这样操作。

package mainimport ( "fmt")type OrderStatus intconst (  Cancelled OrderStatus = iota + 1 //订单已取消 1  NoPay //未支付 2  PendIng // 未发货 3  Delivered // 已发货 4  Received // 已收货 5)//公共行为 赋予类型 String() 函数,方便打印值含义func (order OrderStatus) String() string { return [...]string{"cancelled", "noPay", "pendIng", "delivered", "received"}[order-1]}//创建公共行为 赋予类型 int 函数 EnumIndex()func (order OrderStatus) EnumIndex() int { return int(order)}func main() { var order OrderStatus = Received  fmt.Println(order.String())    // 打印:received  fmt.Println(order.EnumIndex()) // 打印:5}

关于“iota在Go中的使用方法”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: iota在Go中的使用方法

本文链接: https://lsjlt.com/news/275439.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • iota在Go中的使用方法
    这篇文章将为大家详细讲解有关iota在Go中的使用方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。go是什么golang是一种编译语言,可以将代码编译为机器代码,编译后的二进制文件可以直接部署到目标机器...
    99+
    2023-06-14
  • Go语言中的iota怎么使用
    今天小编给大家分享一下Go语言中的iota怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一...
    99+
    2024-04-02
  • Go语言中的Iota关键字怎么使用
    这篇文章主要讲解了“Go语言中的Iota关键字怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go语言中的Iota关键字怎么使用”吧!一、复习常量提到Iota这个关键字,就必须要复习一...
    99+
    2023-07-02
  • Go语言中的Iota关键字
    一、复习常量 提到Iota这个关键字,就必须要复习一下Go语言的常量。 1.Go语言的常量一般使用const声明 2.Go语言的常量只能是布尔型、数字型(整数型、浮点型和复数)和字符...
    99+
    2024-04-02
  • go语言中iota和左移右移的使用说明
    在go语言中iota比较特殊,是一个被编译器修改的常量,在每一个const关键字出现时被重置为0,然后在下一个const出现之前,每出现一次iota,其所代表的数字就会自动加1...
    99+
    2022-06-07
    GO go语言
  • Golang中如何使用 Iota
    这篇文章给大家介绍Golang中如何使用 Iota,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。如何实现枚举iota 是 Go 中预声明的一个特殊常量。它会被预声明为0,但是它的值在编译阶段并非是固定的,当预声明的 i...
    99+
    2023-06-15
  • 如何在go语言中使用scan方法
    如何在go语言中使用scan方法?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。操作环境:windows10系统、GO 1.11.2、thinkpad t480电...
    99+
    2023-06-14
  • 一文搞懂Golang中iota的用法和原理
    目录前言iota的使用iota在const关键字出现时将被重置为0按行计数所有注释行和空行全部忽略跳值占位多个iota一行多个iota首行插队中间插队没有表达式的常量定义复用上一行的...
    99+
    2024-04-02
  • Go中使用加密算法的方法
    目录哈希算法加密模式对称加密⾮对称加密椭圆曲线加密算法ECC数字签名字符编码/解码巨人的肩膀哈希算法  md5 128bit,16字节 如:md5 (“he...
    99+
    2024-04-02
  • 对象在Go语言中的使用方法有哪些?
    Go语言是一种现代化的编程语言,其简单易学、高效、安全等特点,使其成为了越来越多开发者的选择。在Go语言中,对象是一个非常重要的概念,本文将介绍对象在Go语言中的使用方法。 首先,我们需要了解在Go语言中,对象是通过结构体实现的。结构体是一...
    99+
    2023-09-28
    对象 自然语言处理 异步编程
  • Go 函数 API 在 Bash 中的使用方法是什么?
    在 Bash 脚本中使用 Go 函数 API 可以让你的脚本更加高效和灵活。Go 函数 API 是 Go 语言中提供的一组函数库,可以帮助你在 Bash 脚本中实现更加复杂的功能。本文将介绍如何在 Bash 中使用 Go 函数 API,并...
    99+
    2023-08-07
    函数 api bash
  • Go语言中sync.Mutex的使用方法
    目录背景互斥锁注意背景 多个协程操作中经常出现脏读写的情况,这种情况下需要使用互斥锁,保证在对协程共享区域操作的原子性。 如下示例: 启动了 100个协程,每个协程累加 100 次,...
    99+
    2023-03-06
    Go sync.Mutex Go sync.Mutex使用方法
  • Go语言中go mod vendor使用方法
    目录1.背景2.环境3.使用4.原理5.参考1.背景 我们基于 go mod 机制来管理我们项目的依赖库版本,其中 go.mod 记录了依赖库版本信息。 一般第三方依赖库(包括公司...
    99+
    2024-04-02
  • 如何在Go语言中有效使用create方法
    在Go语言中,使用create方法可以很方便地实现对象的创建和初始化操作。create方法通常用于创建对象实例,进行必要的初始化工作,并返回创建好的对象指针。在本文中,我将为您介绍如何...
    99+
    2024-03-12
    go语言 create方法 有效使用
  • 在Django中使用MQTT的方法
    安装MQTT Python环境下安装MQTT也很简单,需要注意的就是不要输错命令 在Python3环境下安装Python MQTT的命令是: pip3 install pah...
    99+
    2024-04-02
  • 在jupyternotebook中使用pytorch的方法
    笔者刚开始学习pytorch时便遇到了无法在jupyter notebook使用anaconda配置的环境的问题,当时尝试了各种方法:卸载重装anaconda、pytorch环境、j...
    99+
    2024-04-02
  • 在SpringBoot中使用HATEOAS的方法
    目录简介文章目标构建Entity和Repository构建HATEOAS相关的RepresentationModel构建ControllerHATEOAS的意义简介 HATEOAS是...
    99+
    2024-04-02
  • LocalDateTime在java中的使用方法
    这篇文章将为大家详细讲解有关LocalDateTime在java中的使用方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。常用的java框架有哪些1.SpringMVC,Spring Web MVC是一种...
    99+
    2023-06-14
  • go语言中的split方法怎么使用
    这篇文章主要介绍了go语言中的split方法怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇go语言中的split方法怎么使用文章都会有所收获,下面我们一起来看看吧。在go语言中,Split()方法用于分...
    99+
    2023-07-05
  • Go并发编程中使用channel的方法
    目录一.设计原理二.数据结构三.创建管道四. 发送数据4.1 直接发送4.2 缓冲区4.3 阻塞发送4.4 小结五. 接收数据5.1 直接接收5.2 缓冲区5.3 阻塞接收六. 关闭...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作