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拥有相同的值时,它们只引用常量池中的同一 ...
随机推荐
- yii2 RESTful API 405 Method Not Allowed
关于 Yii2 中 RESTful API 的开发,可以参考另一篇随笔 http://www.cnblogs.com/ganiks/p/yii2-restful-api-dev.html 测试的过程中 ...
- Service Mesh服务网格新生代--Istio(转)
万字解读:Service Mesh服务网格新生代--Istio 官网地址:https://preliminary.istio.io/zh/docs/concepts/security/ Servic ...
- Python_ip代理
#encoding=utf8import urllibimport urllib2import sys sys.path.append('D:/python/beautifulsoup')sys.pa ...
- 嵌入式开发之davinci--- MSB和LSB
简介: MSB是Most Significant Bit的缩写,最高有效位.在二进制数中,MSB是最高加权位.与十进制数字中最左边的一位类似.通常,MSB位于二进制数的最左侧,LSB位于二进制数的最右 ...
- 【vijos】1764 Dual Matrices(dp)
https://vijos.org/p/1764 自从心态好了很多后,做题的确很轻松. 这种题直接考虑我当前拿了一个,剩余空间最大能拿多少即可. 显然我们枚举每一个点拿出一个矩形(这个点作为右下角), ...
- 《转》openstack中删除虚拟主机,状态一直deleting
一.我重新启动了该机器.之后想删除没有创建成功的虚拟机(没有打开cpu的vt).结果发现状态一直为deleting状态.在这个状态下创建虚拟机也失败. 二.分析:在/var/log/nova/nova ...
- jquery获取checkbox状态
$("#id").is(":checked"); 返回true false
- 【SVM】清晰明了的理论文章
http://www.cnblogs.com/jerrylead/archive/2011/03/13/1982639.html 松弛变量和惩罚因子: http://blog.csdn.net/yan ...
- 【python】map list for 运行时长测试
import time,sys reps=1000 size=10000 def tester(func,*args): starttime=time.time() for i in range(re ...
- springboot如何直接读取webapp下页面?
公司改用springboot的时候,将页面相关的文件都放在了src/main/webapp下,我直接通过main方式启动的时候,无法读取到src/mian/webapp下文件,但是通过spring-b ...