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

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. 截图工具gsnap

    嵌入式linux截图工具的基本原理就是通过读取Framebuffer,把LCD上显示的内容转换成图片格式文件(jpeg.bmp.png). gsnap.bin 1.jpg  /dev/fb0 gsna ...

  2. linux 下启动SVN服务

    先转到SVN的安装目录,比如,你安装在/home/svn 下面. 然后转到bin目录下,在这里可以看见一个叫svnserve的文件,我们需要用这个来启动SVN服务. 试一下svnserve --hel ...

  3. Colored Sticks - poj2513(trie + 并查集)

    问题便转化为:给定一个图,是否存在“一笔画”经过涂中每一点,以及经过每一边一次.这样就是求图中是否存在欧拉路Euler-Path.由图论知识可以知道,无向图存在欧拉路的充要条件为:① 图是连通的:② ...

  4. 解决 Ubuntu 13.04 无法调节屏幕亮度的问题

    13.04与12.04大部分步骤是相同的,只是12.04的方法在13.04中失败了,所以还是有必要说明一下.我到电脑是宏碁AS4750G,硬盘安装系统后电源亮度无法调节. 解决方法如下: 终端输入代码 ...

  5. ChemDraw在苹果电脑上能不能用

    很多ChemDraw 15.1 Pro用户都Windows操作系统用户,近年来随着苹果公司的影响力越来越大,使用苹果电脑的朋友越来越多.一些ChemDraw用户可能会使用苹果电脑,因此特别的关注在苹果 ...

  6. 如何列出github上最多star/fork的project

    访问此页面进行搜索: https://github.com/search/advanced 再参考github高级搜索语法: https://help.github.com/articles/sear ...

  7. NHibernate VS IbatisNet

      NHibernate 是当前最流行的 Java O/R mapping 框架Hibernate 的移植版本,当前版本是 1.0 .2 .它出身于sf.net..IbatisNet 是另外一种优秀的 ...

  8. JAVA大数(转)

    1.输入 首先要想输入需要先包括: import java.util.*; 我们需要其中的 Scanner类声明的对象来扫描控制台输入. 针对A+B来说: import java.util.*; pu ...

  9. 面试STAR法则

    昨天投了几家公司的简历,A公司还没看简历,B公司没有通过简历,另外的后说(其实只投了这两家),B公司最终给了蛮中肯的回复: 虽然,一开始看到这样的结果,有些失落,仔细看过回复后,有些不屑和好奇.百度了 ...

  10. iOS中的armv6、armv7、armv7s

    armv6.armv7.armv7s是arm CPU的指令集,原则上是向下兼容的,如:iPhone4sCPU支持armv7,但它会兼容armv6,只是使用armv6指令可能无法充分发挥它的特性.iph ...