【GO基础】神奇的iota特殊常量
最近在学习GO语言,然后发现有一个特殊常量是以前没有接触过的,比较感兴趣,这里给大家介绍一下。
iota,特殊常量,可以被认为是一个可以被编译器修改的常量。
核心概念:iota在const关键字出现时将被重置为0(const内部的第一行之前),const中每新增一行常量声明将使iota计数一次。
这么来看,简单的来说,iota可以被认为是单个const声明块内的行索引。
我们先来看一个例子,你就能简单的理解iota的基本作用:
// heihei
package main import (
"fmt"
) func main() {
const a=iota //第一个const声明块,仅声明了一个a.iota在这次赋值时值为0,赋值完成后,a声明语句执行完毕,iota等于1.
const (
b=iota
c=iota
) //第二个const声明块,声明了两个值b和c.但是在这里的一开始,iota依然等于0,因为这是一个新的const声明块的开始.随后,iota在给b赋值完毕后,b声明语句执行完毕,iota变成1,然后对c同理.
fmt.Printf("%d", a) //由上可知,此处输出为0
fmt.Println() fmt.Printf("%d,%d",b,c) //由上可知,此处输出为0,1
fmt.Println() }
如上的代码,运行结果如下:

可见,与注释处的说明是一致的。
下面再介绍一个简写的形式,先来看代码:
// heihei
package main import (
"fmt"
) func main() {
const (
a = iota
b
c
) fmt.Printf("%d,%d,%d", a, b, c)
fmt.Println() }
在这个例子中,const声明块里采取了简写的形式,即:若当前行没有赋值语句被书写,则赋值自动采用向上、最近的一个有赋值语句的右侧值。由于b、c均没有赋值,所以,会自动采用最近的一个赋值的值,也就是iota。
那么,想必在这样的操作下,大家应该明白会输出什么了。对了,就是0,1,2.

那么,如果赋值的不是单变量/常量,而是一个表达式,结果会发生变化吗?我们来看代码:
// heihei
package main import (
"fmt"
) func main() {
const (
i = 3 << iota
j
k
) fmt.Printf("%d,%d,%d", i, j, k)
fmt.Println()
}
先来看结果:

可以看到,这样,依然满足前述“省略赋值”情况下的规则,依然是复制了向上、最近的右侧表达式。
好,在了解了上述的一些规则和基础之后,我们来看一个稍微复杂一点的例子,直接上代码:
// heihei
package main import (
"fmt"
) func main() {
const (
a = 666
b = iota
c
d = "hehehe"
e
f = 2 << iota
) fmt.Printf("%d,%d,%d,%s,%s,%d", a, b, c, d, e, f)
fmt.Println()
}
(请自敲代码复刻的注意,由之前规则,可以预见d和e必定为字符串,所以格式输出时换成了%s。当然,也欢迎你继续保持%d,看看结果如何~)
我们先来看结果:

可以看到,在依然遵循了“未当场赋值的声明遵循向上、最近的赋值表达式”这一规则下,即使中间的赋值不再和iota有关,iota依然保持了计数。并在中间的结果中得以体现。
换言之——即使你的表达式中从未出现iota,“幽灵般”的iota依然会默默进行计数,其计数规则与最开始所阐述保持一致。
现在,你应该能更加深刻的理解“简单的来说,iota可以被认为是单个const声明块内的行索引。”这一句话了。
【GO基础】神奇的iota特殊常量的更多相关文章
- JAVA学习(三):Java基础语法(变量、常量、数据类型、运算符与数据类型转换)
Java基础语法(变量.常量.数据类型.运算符与数据类型转换) 1.变量 Java中.用户能够通过指定数据类型和标识符来声明变量.其基本的语法为: DataType identifier; 或 Dat ...
- javascript 概述及基础知识点(变量,常量,运算符,数据类型)
JavaScript概述 1.1 什么是JavaScript: javaScript(简称js),是一种基于对象和事件驱动并具有相对安全性的客户端脚本语言.同时也是一种广泛用于客户端Web开发的脚本语 ...
- 小猪猪逆袭成博士之C++基础篇(二) 常量、处理类型、自定义头文件
小猪猪逆袭成博士之C++基础篇(二) const .auto. decltype 上一章我们介绍了一些常用的类型和常见的问题,下面再介绍一些学习的时候不是特别常用但是在实际工程中很有用的一些东西. 一 ...
- JavaScript基础知识(概念、常量和变量)
1.JavaScript概念 JavaScript是脚本语言; 编写之后,可以直接运行(缺失了编译的过程) 2.JavaScript发展 LiveScript => JavaScri ...
- go基础知识之变量,类型,常量,函数
3 变量 变量是什么 变量指定了某存储单元(Memory Location)的名称,该存储单元会存储特定类型的值.在 Go 中,有多种语法用于声明变量. 声明单个变量 var name type 是声 ...
- Go基础结构与类型02---使用iota定义常量组
package main import "fmt" /*const ( USA = 0 China = 1 Russia = 2 Britain = 3 France = 4 )* ...
- [Java入门笔记] Java语言基础(二):常量、变量与数据类型
常量与变量 什么是常量和变量 常量与变量都是程序在运行时用来存储数据一块内存空间 常量: 常量的值在程序运行时不能被改变,Java中声明常量必须使用final关键字.常量还可以分为两种意思: 第1种意 ...
- C语言基础:进制转换,变量,常量,表达式,基本数据类型,输出函数,输入函数,运算符. 分类: iOS学习 c语言基础 2015-06-10 21:39 25人阅读 评论(0) 收藏
二进制:以0b开头,只有0和1两种数字.如0101 十进制:0~9十个数字表示.如25 十六进制:以0~9,A~F表示,以0X开头.如0X2B 十进制转换为X进制:连除倒取余 X进制转换为十进制:按权 ...
- 1.0 基础、标示符、常量、数据类型(enum 枚举,struct 结构体)、操作符、循环、数组
一.程序 现实生活中,程序是指完成某些事务的一种既定方法和过程,可以把程序看成是一系列动作执行过程的描述. 在计算机世界,程序是指令,即为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的集 ...
随机推荐
- Java并发编程原理与实战二:并行&并发&多线程的理解
1.CPU的发展趋势: 核心数目依旧会越来越多,根据摩尔定律,由于单个核心性能提升有着严重的瓶颈问题,普通的PC桌面在2018年可能回到24核心. 2.并发和并行的区别: 所有的并发处理都有排队等候, ...
- IntelliJ IDEA连接cvs超时Error refreshing view: Timeout while trying to connect to host
在使用IntelliJ IDEA连接cvs的时候,有时会报超时错误: Error refreshing view: Timeout while trying to connect to host: 1 ...
- laravel 带条件的分页查询
laravel 带条件的分页查询, 原文:http://blog.csdn.net/u011020900/article/details/52369094 bug:断点查询,点击分页,查询条件消失. ...
- CF 1008C Reorder the Array
You are given an array of integers. Vasya can permute (change order) its integers. He wants to do it ...
- Linux服务-搭建Nginx
任务目标:二进制安装nginx包,作为web服务修改配置文件,让配置生效,验证配置 首先使用yum 来安装 nginx 服务,基于epel-release平台的nginx需要epel的支持,所以要先安 ...
- 关于Unix/Linux的终端、伪终端、控制台和shell
历史是什么:是过去传到将来的回声,是将来对过去的反映. ——雨果(法)<笑面人> 阅读本文大概需要花费你15分钟 文章导航: 计算机的发展 UNIX系统的诞生 UNIX系统的发展 终端与控 ...
- const与指针
C++中const与指针 1.常指针: ; int * const pInt = &x; 其中PInt是常指针,pInt的值无法改变,但其指向的内容可以改变. 2.指向常量的指针 有两种写法: ...
- CertUtil.exe被利用来下载恶意软件
1.前言 经过国外文章信息,CertUtil.exe下载恶意软件的样本. 2.实现原理 Windows有一个名为CertUtil的内置程序,可用于在Windows中管理证书.使用此程序可以在Windo ...
- Logback的继承体系
今天碰到一个问题,发现控制台日志输出两遍,搜索得知,这个是由于logback继承体系导致的. logback不仅会继承level,也会继承appender,需要注意的是: <root> & ...
- 3->集群架构主机克隆教程
centos7系统集群主机克隆: 有道笔记链接地址