最近在学习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特殊常量的更多相关文章

  1. JAVA学习(三):Java基础语法(变量、常量、数据类型、运算符与数据类型转换)

    Java基础语法(变量.常量.数据类型.运算符与数据类型转换) 1.变量 Java中.用户能够通过指定数据类型和标识符来声明变量.其基本的语法为: DataType identifier; 或 Dat ...

  2. javascript 概述及基础知识点(变量,常量,运算符,数据类型)

    JavaScript概述 1.1 什么是JavaScript: javaScript(简称js),是一种基于对象和事件驱动并具有相对安全性的客户端脚本语言.同时也是一种广泛用于客户端Web开发的脚本语 ...

  3. 小猪猪逆袭成博士之C++基础篇(二) 常量、处理类型、自定义头文件

    小猪猪逆袭成博士之C++基础篇(二) const .auto. decltype 上一章我们介绍了一些常用的类型和常见的问题,下面再介绍一些学习的时候不是特别常用但是在实际工程中很有用的一些东西. 一 ...

  4. JavaScript基础知识(概念、常量和变量)

    1.JavaScript概念 JavaScript是脚本语言; 编写之后,可以直接运行(缺失了编译的过程) 2.JavaScript发展 LiveScript    =>    JavaScri ...

  5. go基础知识之变量,类型,常量,函数

    3 变量 变量是什么 变量指定了某存储单元(Memory Location)的名称,该存储单元会存储特定类型的值.在 Go 中,有多种语法用于声明变量. 声明单个变量 var name type 是声 ...

  6. Go基础结构与类型02---使用iota定义常量组

    package main import "fmt" /*const ( USA = 0 China = 1 Russia = 2 Britain = 3 France = 4 )* ...

  7. [Java入门笔记] Java语言基础(二):常量、变量与数据类型

    常量与变量 什么是常量和变量 常量与变量都是程序在运行时用来存储数据一块内存空间 常量: 常量的值在程序运行时不能被改变,Java中声明常量必须使用final关键字.常量还可以分为两种意思: 第1种意 ...

  8. 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进制转换为十进制:按权 ...

  9. 1.0 基础、标示符、常量、数据类型(enum 枚举,struct 结构体)、操作符、循环、数组

    一.程序 现实生活中,程序是指完成某些事务的一种既定方法和过程,可以把程序看成是一系列动作执行过程的描述. 在计算机世界,程序是指令,即为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的集 ...

随机推荐

  1. centos无法通过ssh连接的解决

    系统环境是centos7,虚拟机环境下的.在使用ssh工具连接虚拟机的时候发现连接不上,用的是root 先检查openssh-server是否安装: yum list installed | grep ...

  2. JavaScript辅助响应式

    js响应式 rem辅助响应式布局:其实就是指在HTML页面的大小不断变化的时候,里面的宽.高.字体等等也随之变化,主要是通过获取window.innerwidth的值来进行判断,7.5rem===10 ...

  3. Python练习-一个简单易懂的迭代器,了解一下

    今天我们学习了迭代器,其实可以理解为是一个元素容器被遍历的方式,不难理解,看看下面的小例子: # 编辑者:闫龙 #一个简单的迭代器 l = [1,2,3,4,5,6,7]#建立一个列表l ite = ...

  4. Linux下ssh的使用

    更多内容推荐微信公众号,欢迎关注: 摘抄自:https://www.cnblogs.com/kevingrace/p/6110842.html 对于linux运维工作者而言,使用ssh远程远程服务器是 ...

  5. 【译】第八篇 Replication:合并复制-How it works

    本篇文章是SQL Server Replication系列的第八篇,详细内容请参考原文. 在这一系列的前几篇你已经学习了如何在多服务器环境中配置合并复制.这一篇将介绍合并代理并解释它在复制过程中扮演的 ...

  6. 系统学习(javascript)_基础(数据类型一)

    五种基本数据类型:Number,String,Boolean,Null,Undefind: 三种引用数据类型:Object,Array,Symbol: Symbol为ECMAScript6新增的数据类 ...

  7. 手动刷入Android 4.4.1 KOT49E OTA更新包

    一.Android 4.4 KitKat Google前段时间发布了Android新版本Android 4.4 KitKat,由于我的Nexus 4也是托朋友从US带回来的,所以很快就收到了Googl ...

  8. css 实现圆形头像

    1.方法一 直接设置img为圆形,这种情况下如果图片不是正方形,图片会被拉伸 <img class="circleImg" src="../img/photo/im ...

  9. Linux触摸屏驱动测试程序范例【转】

    转自:http://blog.sina.com.cn/s/blog_4b4b54da0102viyl.html 转载2015-05-09 16:28:27 标签:androiditlinux 触摸屏驱 ...

  10. jQuery学习(二) 自定义扩展函数

    jQuery函数调用写法很优雅,在项目开发过程中,有需要自定义函数经常被使用到,将这些函数放置到项目ExtTool.js中,为了编码方式的统一,也希望这些自定义函数与jQuery函数一致的调用方式.在 ...