網站首頁 編程語言 正文
前言
我們知道iota
是go語言的常量計數器,只能在常量的const
表達式中使用,在const
關鍵字出現的時將被重置為0
,const
中每新增一行常量聲明iota值自增1(iota
可以理解為const語句塊中的行索引),使用iota可以簡化常量的定義,但其規則必須要牢牢掌握,否則在我們開發中可能會造成誤解,本文嘗試全面總結其使用用法以及其實現原理,需要的朋友可以參考以下內容,希望對大家有幫助。
iota的使用
iota在const關鍵字出現時將被重置為0
iota
只能在常量的表達式中使用,iota
在const
關鍵字出現時將被重置為0
。不同const
定義塊互不干擾。
//const關鍵字出現時將被重置為0 const ( a = iota //0 b //1 ) //不同const定義塊互不干擾 const ( c = iota //0 )
按行計數
const每新增一行常量聲明,iota計數一次,可以當做const語句中的索引,常用于定義枚舉數據。
const ( n1 = iota //0 n2 //1 n3 //2 n4 //3 )
所有注釋行和空行全部忽略
所有注釋行和空行在編譯時期首先會被清除,所以空行不計數。
const ( a = iota //0 b //1 //此行是注釋 c //2 )
跳值占位
如果某個值不需要,可以使用占位 “_”
,它不是空行,會進行計數,起到跳值作用。
const ( a = iota //0 _ b //2 )
多個iota
同一const塊出現多個iota,只會按照行數計數,不會重新計數。
const ( a = iota // a=0 b = iota // b=1 c = iota // c=2 )
一行多個iota
一行多個iota,分別計數。
const ( a, b = iota, iota // a=0,b=0 c, d // c=1,d=1 )
首行插隊
開頭插隊會進行計數。
const ( a = 100 // a=100 b = iota // b=1 c = iota // c=2 d // d=3 )
中間插隊
中間插隊會進行計數。
const ( a = iota // a=0 b = 100 // b=100 c = iota // c=2 d // d=3 )
沒有表達式的常量定義復用上一行的表達式
const ( a = iota // iota = 0 b = 1 + iota // iota = 1 c // iota = 2 )
實現原理
iota定義
iota 源碼在 Go 語言代碼庫中的定義位于內建文件 go/src/builtin/builtin.go
中:
const iota = 0 // Untyped int.iota
在這里聲明了一個常量標識符,它的值是0;iota只是一個簡單的整數0,為什么能作為常量計數器進行自增的,我們再看一下const的實現。
const
const 塊中每一行在 Go 中使用 spec 數據結構描述, spec 聲明如下:
ValueSpec struct { Doc *CommentGroup // associated documentation; or nil Names []*Ident // value names (len(Names) > 0) Type Expr // value type; or nil Values []Expr // initial values; or nil Comment *CommentGroup // line comments; or nil }
在這個結構體中有一個切片 ValueSpec.Names,此切片中保存了一行中定義的常量,如果一行定義N個常量,那么 ValueSpec.Names 切片長度即為N。
const塊實際上是spec類型的切片,用于表示const中的多行。
編譯期間構造常量時的偽算法如下:
for iota, spec := range ValueSpecs { for i, name := range spec.Names { obj := NewConst(name, iota...) //此處將iota傳入,用于構造常量 ... } }
iota實際上是遍歷const塊的索引,每行中即便多次使用iota,其值也不會遞增。
原文鏈接:https://juejin.cn/post/7136181476542349320
相關推薦
- 2022-09-23 win11下FTP服務器搭建圖文教程_FTP服務器
- 2023-01-09 Redis排序命令Sort深入解析_Redis
- 2022-05-31 Python學習之日志模塊詳解_python
- 2022-09-15 windows中cmd下添加、刪除和修改靜態路由實現_DOS/BAT
- 2022-12-03 C++實現重載矩陣的部分運算符_C 語言
- 2022-06-22 如何利用Android仿微博正文鏈接交互效果_Android
- 2022-12-01 Python?async+request與async+aiohttp實現異步網絡請求探索_pytho
- 2023-02-01 Flutter?彈性布局基石flex算法flexible示例詳解_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支