常量是一个简单值的标识符,在程序运行时,不会被修改的量
常量中的数据类型只可以是布尔值、数字型(整数型、浮点型和复数)和字符串。
常量的定义格式:

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——常量的更多相关文章

  1. C++11特性——变量部分(using类型别名、constexpr常量表达式、auto类型推断、nullptr空指针等)

    #include <iostream> using namespace std; int main() { using cullptr = const unsigned long long ...

  2. JavaScript 常量定义

    相信同学们在看见这个标题的时候就一脸懵逼了,什么?JS能常量定义?别逗我好吗?确切的说,JS当中确实没有常量(ES6中好像有了常量定义的关键字),但是深入一下我们可以发现JS很多不为人知的性质,好好利 ...

  3. ES6之变量常量字符串数值

    ECMAScript 6 是 JavaScript 语言的最新一代标准,当前标准已于 2015 年 6 月正式发布,故又称 ECMAScript 2015. ES6对数据类型进行了一些扩展 在js中使 ...

  4. Java常量的应用

    所谓常量,我们可以理解为是一种特殊的变量,它的值被设定后,在程序运行过程中不允许改变. 语法:final 常量名 = 值; 使用fianl关键字 常量名 值 final String a1 = &qu ...

  5. 原创 C++之常量(二)

    4常量的内存分配 4.1应用程序的内存结构 一个由C++编译的应用程序,占用的内存可以划分为如下几个部分: 栈(stack).由编译器自动分配释放.存放函数参数和函数里的局部变量(又称自动变量).其操 ...

  6. 原创 C++之常量(一)

    1概述 一个C++程序就是一系列数据与操作的集合.当一个C++程序开始运行的时候,与该程序相关的数据就会被加载到内存中.当数据与内存发生关联的时候,这些数据就会具有如下的特性: 数据在内存中的地址.这 ...

  7. 1.2 - C#语言习惯 - 用运行时常量readonly而不是编译期常量const

    C#中有两种类型的常量:编译期常量和运行时常量.二者有着截然不同的行为,使用不当将会带来性能上或正确性上的问题. 这两个问题最好都不要发生,不过若难以同时避免的话,那么一个略微慢一些但能保证正确的程序 ...

  8. swift 简介和常量与变量 --- swift 入门

    一.思维导图 二. 代码 //创建UIView 和按钮 let views = UIView(frame: CGRect(x:20, y: 20, width: 100, height: 100))/ ...

  9. java为什么非静态内部类中不能有static修饰的属性,但却可以有常量?

    如:public class InnerClassDemo{int x;class A{static int a = 0;//这样写是不合法的.static final int b=0;//这样写是合 ...

  10. String字符串针对常量池的优化

    String对象是java语言中重要的数据类型,但是不是基本数据类型.相对于c语言的char java做了一些封装和延伸. 针对常量池的优化:当两个String拥有相同的值时,它们只引用常量池中的同一 ...

随机推荐

  1. Java 使用 HttpClient调用https 最新源码 JDK7+ apache4.3+

    在项目使用https方式调用别人服务的时候,以前要写很多的代码,现在框架封装了很多,所以不用再写那么多了. 网上看了一下,都是很老的版本,用过时的DefaultHttpClient. 以spring为 ...

  2. HashMap与TreeMap的区别?

    HashMap与TreeMap的区别? 解答:HashMap通过hashcode对其内容进行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用Tre ...

  3. 【vijos】1447 开关灯泡(高精度+特殊的技巧)

    https://vijos.org/p/1447 一开始想了想似乎只想到了与约数个数有关,即约数个数为奇数那么显然是亮的. 竟然没想到完全平方数..sad.. 在正因子中,只有完全平方数的正因子才是奇 ...

  4. MAC Ruby版本需要升级至2.2.2以上

    第一例: 默认情况下,Mac OS X 系统已经安装好 Ruby(最新的 Mavericks 随机的 Ruby 版本为 2.0.0p247),安装在 /System/Library/Framework ...

  5. 蓝桥杯 第三届C/C++预赛真题(10) 取球游戏(博弈)

    今盒子里有n个小球,A.B两人轮流从盒中取球,每个人都可以看到另一个人取了多少个,也可以看到盒中还剩下多少个,并且两人都很聪明,不会做出错误的判断. 我们约定: 每个人从盒子中取出的球的数目必须是:1 ...

  6. html空格字符

    一.使用全角空格IDEOGRAPHIC SPACE----  Encodings HTML Entity (decimal)   HTML Entity (hex)   How to type in ...

  7. python3的安装,Window与linux

    一.window安装 1.首先是window下的安装. 进入python网站https://www.python.org/downloads/下载页面,选择所需要的版本进行下载. 点击Download ...

  8. AtomicInteger保证线程安全的全局变量

    现有业务场景需要做一个线程间的全局变量,并且实现自增效果. 初始使用了volatile 来保证count的安全性,如下: import java.util.concurrent.ExecutorSer ...

  9. C语言数据类型大小

    数据类型大小是由操作系统和编译器共同决定的,但必须满足: short和int至少为16bit:long至少为32bit: short不能超过int,int不能超过long. 在主流编译器中,32位机和 ...

  10. 170208、用Navicat自动备份mysql数据库

    数据库备份很重要,很多服务器经常遭到黑客的恶意攻击,造成数据丢失,如果没有及时备份的话,后果不堪设想. 一:备份的目的: 做灾难恢复:对损坏的数据进行恢复和还原 需求改变:因需求改变而需要把数据还原到 ...