最近在学习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. HDU 1717 小数化分数2 数学题

    解题报告:输入一个小于1的小数,让你把这个数转化成分数,但注意,输入的数据还有无限循环的小数,循环节用一对括号包含起来. 之前还没有写过小数转分数的题,当然如果没有循环小数的话,应该比较简单,但是这题 ...

  2. Linux Shell管道调用用户定义函数(使shell支持map函数式特性)

    Linux中有一个管道的概念,常用来流式的处理文本内容,比如一个文件对其中的每一行应用好几个操作,出于两个方面的考虑可能需要在管道中使用用户定义函数: 1. 刚需: 内置的sed/awk之类的可能没法 ...

  3. c++ new 和delete

    c++中new和delete的使用方法 new和delete运算符用于动态分配和撤销内存的运算符 new用法: 1.     开辟单变量地址空间 1)new int;  //开辟一个存放数组的存储空间 ...

  4. c++细节--section1

    1.register声明的变量为寄存器变量,因此没有地址,不能对它取地址操作. 2.[用错sizeof]当数组作为函数参数传递时,数组会退化为同类型的指针. 3.每个成员在成员初始化列表中只能出现一次 ...

  5. 对web标准的理解,以及对w3c组织的认识

    (1)web标准规范要求,书写标签必须闭合.标签小写.不乱嵌套,可提高搜索机器人对网页内容的搜索几率.--- SEO(2)建议使用外链css和js脚本,从而达到结构与行为.结构与表现的分离,提高页面的 ...

  6. centos 安装memcache服务后memcahce本机连接Permission

    自己手动在虚拟机下装了下memcache,整个过程真是充满波折,本身用php5.3安装memcache扩展就麻烦很多,无法通过yum直接安装,安装方法详见http://chenwei.me/blog/ ...

  7. 浅析Postgres中的并发控制(Concurrency Control)与事务特性(上)

    转载:https://www.cnblogs.com/flying-tiger/p/9567213.html#4121483#undefined PostgreSQL为开发者提供了一组丰富的工具来管理 ...

  8. python 根据输入的内容输出类型

    类型判断 from functools import singledispatch import numbers from collections import abc from collection ...

  9. CentOS系统时间与现在时间相差8小时解决方法

    很多网友在安装完CentOS系统后发现时间与现在时间相差8小时,这是由于我们在安装系统的时选择的时区是上海,而CentOS默认bios时间是utc时间,所以时间相差了8小时.这个时候的bios的时间和 ...

  10. 虚拟机 CentOS7 64

    下载地址:https://www.centos.org/download/ 下载完后以后使用虚拟机安装即可