最近在学习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. 让vcmi支持英雄无敌3中文版

    Table of Contents 1 Hack 日志 2 Changes 3 Install by compiling 4 reply of Ivan 1 Hack 日志 8月22日开始动手修改改v ...

  2. HDU 2073 叠框

    解题报告:一个字符串的题,最恶心的还是格式问题,PE了很多次,要求是每个测试数据的后面都带有一个空行,但是最后一个不能有空行,所以只能把第一组 数据的前面不输出空行,而后面的每一组数据都输出空行,这样 ...

  3. 浏览器断点调试js

    说了一些 Chrome 开发者工具的技巧,其实并没有涉及到开发者工具最核心的功能之一:断点调试.断点可以让程序运行到某一行的时候,把程序的整个运行状态进行冻结.你可以清晰地看到到这一行的所有的作用域变 ...

  4. [译] 用HTML5捕获音频和视频

    原文地址:http://www.html5rocks.com/en/tutorials/getusermedia/intro/ 概述 有了HTML5,我们就可以在不借助Flash或者Silverlig ...

  5. php中global和$GLOBALS最浅显易懂的解释

    官方文档: global指对变量的引用或者叫指针,$GLOBALS则是变量本身: $var1 = 1; $var2 = 2; function fun(){ $GLOBALS['var2'] = &a ...

  6. 20165227 学习基础和C语言基础调查

    学习基础和C语言基础调查 技能学习经验和感悟 你有什么技能比大多人(超过90%以上)更好? 如果非要说出来一个的话,那就是篮球了.从热爱篮球,到热爱打篮球,经历挫折阻碍,不断反思学习,一步一步地向前迈 ...

  7. jenkins 和 git 的每日构建

    没有太难的技术含量,只要按照步骤操作就可以成功 step 1:全局工具配置git.exe 首先,登录 Jenkins ,在首页找到 “系统管理 -> Global Tool Configurat ...

  8. aarch64_j1

    JSCookMenu-2.0.4-13.fc26.noarch.rpm 2017-02-14 07:06 37K fedora Mirroring Project Java-WebSocket-1.3 ...

  9. redis学习笔记之redis简介

    redis简介 Redis是一个开源的,高性能的,基于键值对的缓存与存储系统,通过设置各种键值数据类型来适应不同场景下的缓存与存储需求.同事redis的诸多高层级功能使其可以胜任消息队列,任务队列等不 ...

  10. 手动实现图片预览-放大缩小全屏支持IE9以上

    #{extends '/Index/index.html' /} #{set title:'意见反馈' /} <script src="/public/mgr/javascripts/ ...