go——常量
常量是一个简单值的标识符,在程序运行时,不会被修改的量
常量中的数据类型只可以是布尔值、数字型(整数型、浮点型和复数)和字符串。
常量的定义格式:
const identifier [type] = value
你可以省略类型说明符[type],因为编译器可以根据变量的值来推断其类型。
显式定义:
const b string = “abc”
隐式定义:
const b = “abc”
多个相同类型的声明可以简写为:
const c_name1,c_name2 = value1,value2
下面是一个综合示例:
package main const x int = 100 //显式定义
const y = false //隐式定义
const m, n = 111, 222 //一次定义多个,前提条件是类型一致 func main() {
const ( //以组的方式批量定义
i, f = 0, 1
b = false
)
}
需要说明的是定义常量但是不使用常量并不会报错。
如果显式定义常量,必须保证常量左右两边的类型必须一致,需要的时候可以做显式转化。
同时,右值不能超出常量类型取值范围,否则会引发溢出错误。
const k uint8 = 999 //constant 999 overflows uint8,uint8的最大取值是255
常量也可以是某些编译器能计算出结果的表达式。
const (
ptrSize = unsafe.Sizeof(uintptr(0))
strSize = len("hello, world")
)
在常量组中如不指定类型和初始化值,则与上一行非空常量右值相同。
package main import "fmt" func main() {
const (
x int = 18
y //与上一行x类型和值相同
z = "abc"
s
)
fmt.Printf("%T, %v\n", y, y)
fmt.Printf("%T, %v\n", s, s)
} /*
结果:
int, 18
string, abc
*/
iota
iota,特殊常量,可以认为是一个可以被编译器修改的常量。
iota在const关键字出现时将被重置为0(const内部的第一行之前),
const中每新增一行常量声明将使iota计数一次(iota可以理解为const语句块中的行索引。)
const (
a = iota
b = iota
c = iota
)
第一个iota等于0,每当iota在新的一行被使用时,它的值都会自动加1,所以a=0,b=1,c=2,
可以简写为如下形式:
const (
a = iota
b
c
)
看几个简单的例子:
示例1:
package main import "fmt" const (
_ = iota
kb = 1 << (10 * iota)
mb
gb
)
/*
gb和mb的值与kb的值相同
(kb = 1) << (10 * 1) 1 * 2**10 = 1024
(mb = 1) << (10 * 2) 1 * 2**20 = 1048576
(gb = 1) << (10 * 3) 1 * 2**30 = 1073741824
*/
//iota值是自增的,向左移动n位,就是乘以2的n次方 func main() {
fmt.Println(kb, mb, gb)
}
/*
结果:
1024 1048576 1073741824
*/
示例2:
package main import "fmt" func main() {
const (
a = iota //0
b //1
c //2
d = "hello" //重新赋值,但是iota +=1
e //引用上面,但是iota +=1
f = 100 //重新赋值
g
h = iota //7 如果中断iota自增,必须显式恢复
i //8
)
fmt.Println(a, b, c, d, e, f, g, h, i)
} //a, b, c, d, e, f, g, h, i
//0 1 2 hello hello 100 100 7 8
常量与变量本质的差别
不同于变量在运行期间分配存储内存,常量通常会被编译器在预处理阶段直接展开,作为指令数据使用
package main import "fmt" var x = 0x100 const y = 0x200 func main() {
fmt.Println(&x, x)
fmt.Println(&y, y) //cannot take the address of y 无法获取内存地址
}
数字常量不会被分配存储空间,无需像变量那样通过内存来取值,因此无法获取内存地址。
go——常量的更多相关文章
- C++11特性——变量部分(using类型别名、constexpr常量表达式、auto类型推断、nullptr空指针等)
#include <iostream> using namespace std; int main() { using cullptr = const unsigned long long ...
- JavaScript 常量定义
相信同学们在看见这个标题的时候就一脸懵逼了,什么?JS能常量定义?别逗我好吗?确切的说,JS当中确实没有常量(ES6中好像有了常量定义的关键字),但是深入一下我们可以发现JS很多不为人知的性质,好好利 ...
- ES6之变量常量字符串数值
ECMAScript 6 是 JavaScript 语言的最新一代标准,当前标准已于 2015 年 6 月正式发布,故又称 ECMAScript 2015. ES6对数据类型进行了一些扩展 在js中使 ...
- Java常量的应用
所谓常量,我们可以理解为是一种特殊的变量,它的值被设定后,在程序运行过程中不允许改变. 语法:final 常量名 = 值; 使用fianl关键字 常量名 值 final String a1 = &qu ...
- 原创 C++之常量(二)
4常量的内存分配 4.1应用程序的内存结构 一个由C++编译的应用程序,占用的内存可以划分为如下几个部分: 栈(stack).由编译器自动分配释放.存放函数参数和函数里的局部变量(又称自动变量).其操 ...
- 原创 C++之常量(一)
1概述 一个C++程序就是一系列数据与操作的集合.当一个C++程序开始运行的时候,与该程序相关的数据就会被加载到内存中.当数据与内存发生关联的时候,这些数据就会具有如下的特性: 数据在内存中的地址.这 ...
- 1.2 - C#语言习惯 - 用运行时常量readonly而不是编译期常量const
C#中有两种类型的常量:编译期常量和运行时常量.二者有着截然不同的行为,使用不当将会带来性能上或正确性上的问题. 这两个问题最好都不要发生,不过若难以同时避免的话,那么一个略微慢一些但能保证正确的程序 ...
- swift 简介和常量与变量 --- swift 入门
一.思维导图 二. 代码 //创建UIView 和按钮 let views = UIView(frame: CGRect(x:20, y: 20, width: 100, height: 100))/ ...
- java为什么非静态内部类中不能有static修饰的属性,但却可以有常量?
如:public class InnerClassDemo{int x;class A{static int a = 0;//这样写是不合法的.static final int b=0;//这样写是合 ...
- String字符串针对常量池的优化
String对象是java语言中重要的数据类型,但是不是基本数据类型.相对于c语言的char java做了一些封装和延伸. 针对常量池的优化:当两个String拥有相同的值时,它们只引用常量池中的同一 ...
随机推荐
- 截图工具gsnap
嵌入式linux截图工具的基本原理就是通过读取Framebuffer,把LCD上显示的内容转换成图片格式文件(jpeg.bmp.png). gsnap.bin 1.jpg /dev/fb0 gsna ...
- linux 下启动SVN服务
先转到SVN的安装目录,比如,你安装在/home/svn 下面. 然后转到bin目录下,在这里可以看见一个叫svnserve的文件,我们需要用这个来启动SVN服务. 试一下svnserve --hel ...
- Colored Sticks - poj2513(trie + 并查集)
问题便转化为:给定一个图,是否存在“一笔画”经过涂中每一点,以及经过每一边一次.这样就是求图中是否存在欧拉路Euler-Path.由图论知识可以知道,无向图存在欧拉路的充要条件为:① 图是连通的:② ...
- 解决 Ubuntu 13.04 无法调节屏幕亮度的问题
13.04与12.04大部分步骤是相同的,只是12.04的方法在13.04中失败了,所以还是有必要说明一下.我到电脑是宏碁AS4750G,硬盘安装系统后电源亮度无法调节. 解决方法如下: 终端输入代码 ...
- ChemDraw在苹果电脑上能不能用
很多ChemDraw 15.1 Pro用户都Windows操作系统用户,近年来随着苹果公司的影响力越来越大,使用苹果电脑的朋友越来越多.一些ChemDraw用户可能会使用苹果电脑,因此特别的关注在苹果 ...
- 如何列出github上最多star/fork的project
访问此页面进行搜索: https://github.com/search/advanced 再参考github高级搜索语法: https://help.github.com/articles/sear ...
- NHibernate VS IbatisNet
NHibernate 是当前最流行的 Java O/R mapping 框架Hibernate 的移植版本,当前版本是 1.0 .2 .它出身于sf.net..IbatisNet 是另外一种优秀的 ...
- JAVA大数(转)
1.输入 首先要想输入需要先包括: import java.util.*; 我们需要其中的 Scanner类声明的对象来扫描控制台输入. 针对A+B来说: import java.util.*; pu ...
- 面试STAR法则
昨天投了几家公司的简历,A公司还没看简历,B公司没有通过简历,另外的后说(其实只投了这两家),B公司最终给了蛮中肯的回复: 虽然,一开始看到这样的结果,有些失落,仔细看过回复后,有些不屑和好奇.百度了 ...
- iOS中的armv6、armv7、armv7s
armv6.armv7.armv7s是arm CPU的指令集,原则上是向下兼容的,如:iPhone4sCPU支持armv7,但它会兼容armv6,只是使用armv6指令可能无法充分发挥它的特性.iph ...