Go 知识iota

2024-01-20 18:04
文章标签 go 知识 iota

本文主要是介绍Go 知识iota,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Go 知识iota

  • 1. 介绍
  • 2. 特性
  • 3. 原理
  • 4. 你真的理解了吗

1. 介绍

iota 是一个预定义的标识符,用于声明枚举常量。它在 const 声明中使用,表示连续的未类型化整数。其值从0开始,const声明块每增加一行,iota的值就会自增1,即使没有使用也会增加。

2. 特性

  • iota 只能用在cont中使用
  • 每当遇到cont关键字,iota就会被重置为0
  • iota代表了cont声明的行索引
  • const中的声明如果没有指定值,那么等于iota的值
  • iota可以和表达式使用
  • const声明中没有指定值,继承上一行的值的时候,会进行继承,继承的时候也会继承表达式

举例:


import ("fmt""testing"
)const (index0, value0, express0 = iota, iota, iota + 1index1, value1, express1                         // 继承_, _, _                                          // iota 表示行索引,这里什么也不赋值,只是增加行索引index3, value3, express3                         // 继承index4, value4, express4 = iota, iota, iota * 10 // 修改表达式index5, value5, express5                         // 继承// 空行,iota 不会加,注释不参与代码逻辑index6, value6, express6 = -1, -1, -1 // 没有使用也会加index7, value7, express7 = iota, iota, iota * 3
)
const (// 空行,iota 不会加,注释不参与代码逻辑index, value, express = iota, iota, iota * 3 // 重置
)func TestIota(t *testing.T) {fmt.Println(index0, value0, express0)fmt.Println(index1, value1, express1)fmt.Println(index3, value3, express3)fmt.Println(index4, value4, express4)fmt.Println(index5, value5, express5)fmt.Println(index6, value6, express6)fmt.Println(index7, value7, express7)fmt.Println(index, value, express)
}

在这里插入图片描述

3. 原理

iota标识符仅能用于常量声明语句中,iota的取值与常量声明块中的代码的行数强相关。
可以发现在常量的声明块中,一行可以声明多个常量,但是在一个常量块中,每行的常量数量必须一致。
如果凑不足,可以使用_占位。
仔细研究常量块,可以发现常量在编译中的表示,可以近似如下理解:

type ConstMeta struct {Doc     *string // 单行注释,也就是空行Names   []*string // 每行有多少个常量的名字Type    string // 常量的类型 , 有可能为空,表示值类型,一般只有表达式这个才有效Values  []*interface{} // 常量的值Comment *string // 行内注释
}

一个常量块有多少行,就会有多少个ConstMeta,需要注意的是,单行注释会和下面的常量定义合并在一起。
类似的伪代码可以如下:

	for iota, meta := range consts {for i, name := range meta.Names {tmp := *name + strconv.Itoa(iota)meta.Values[i] = &tmp}}

所以iota会存在如下特征:

  • 单个const块从0开始
  • const块中每增加一行,iota的值就加1,即使没有使用iota也会增加
  • 单行声明中,即使出现多个iota的使用,iota的值也不变

4. 你真的理解了吗

  • Go 标准库syslog,日志级别。
type Priority intconst (LOG_EMERG Priority = iotaLOG_ALTERLOG_CRITLOG_ERRLOG_WARNNINGLOG_NOTICELOG_INFOLOG_DEBUG
)

在这里插入图片描述

  • Go 标准库 sync ,互斥锁的状态。
const (mutexLocked = 1 << iota // mutex is lockedmutexWokenmutexStarvingmutexWaiterShift = iotastarvationThresholdNs = 1e6
) 

在这里插入图片描述

这篇关于Go 知识iota的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/626857

相关文章

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

sqlite3 相关知识

WAL 模式 VS 回滚模式 特性WAL 模式回滚模式(Rollback Journal)定义使用写前日志来记录变更。使用回滚日志来记录事务的所有修改。特点更高的并发性和性能;支持多读者和单写者。支持安全的事务回滚,但并发性较低。性能写入性能更好,尤其是读多写少的场景。写操作会造成较大的性能开销,尤其是在事务开始时。写入流程数据首先写入 WAL 文件,然后才从 WAL 刷新到主数据库。数据在开始

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

Go Playground 在线编程环境

For all examples in this and the next chapter, we will use Go Playground. Go Playground represents a web service that can run programs written in Go. It can be opened in a web browser using the follow

go基础知识归纳总结

无缓冲的 channel 和有缓冲的 channel 的区别? 在 Go 语言中,channel 是用来在 goroutines 之间传递数据的主要机制。它们有两种类型:无缓冲的 channel 和有缓冲的 channel。 无缓冲的 channel 行为:无缓冲的 channel 是一种同步的通信方式,发送和接收必须同时发生。如果一个 goroutine 试图通过无缓冲 channel

如何确定 Go 语言中 HTTP 连接池的最佳参数?

确定 Go 语言中 HTTP 连接池的最佳参数可以通过以下几种方式: 一、分析应用场景和需求 并发请求量: 确定应用程序在特定时间段内可能同时发起的 HTTP 请求数量。如果并发请求量很高,需要设置较大的连接池参数以满足需求。例如,对于一个高并发的 Web 服务,可能同时有数百个请求在处理,此时需要较大的连接池大小。可以通过压力测试工具模拟高并发场景,观察系统在不同并发请求下的性能表现,从而

【Go】go连接clickhouse使用TCP协议

离开你是傻是对是错 是看破是软弱 这结果是爱是恨或者是什么 如果是种解脱 怎么会还有眷恋在我心窝 那么爱你为什么                      🎵 黄品源/莫文蔚《那么爱你为什么》 package mainimport ("context""fmt""log""time""github.com/ClickHouse/clickhouse-go/v2")func main(

Go Select的实现

select语法总结 select对应的每个case如果有已经准备好的case 则进行chan读写操作;若没有则执行defualt语句;若都没有则阻塞当前goroutine,直到某个chan准备好可读或可写,完成对应的case后退出。 Select的内存布局 了解chanel的实现后对select的语法有个疑问,select如何实现多路复用的,为什么没有在第一个channel操作时阻塞 从而导

Go Channel的实现

channel作为goroutine间通信和同步的重要途径,是Go runtime层实现CSP并发模型重要的成员。在不理解底层实现时,经常在使用中对channe相关语法的表现感到疑惑,尤其是select case的行为。因此在了解channel的应用前先看一眼channel的实现。 Channel内存布局 channel是go的内置类型,它可以被存储到变量中,可以作为函数的参数或返回值,它在r

Go 数组赋值问题

package mainimport "fmt"type Student struct {Name stringAge int}func main() {data := make(map[string]*Student)list := []Student{{Name:"a",Age:1},{Name:"b",Age:2},{Name:"c",Age:3},}// 错误 都指向了最后一个v// a