介绍
常量是一种表达式,其可以在程序编译阶段就可以算出来。其值本质上都属于基本类型:布尔值、字符串、数字。
常量在程序运行过程中,不允许被修改,恒定不变。
因为常量的值在编译的时候就可以知道,所以可以出现在类型的声明中,例如数组中
const IPv4Len = 4
var p [IPv4Len]byte // 出现在数组的声明中
常量可以指定类型,如果没有指定的话,就以右边表达式自动推导:
const IP string = "127.0.0.1"
fmt.Printf("%T", IP) // string
// 自动推导为无类型字符串
const name = "zhangsan"
fmt.Printf("%T", name) // string
若同时声明一组常量,除了第一项外,其它项右侧的表达式都可以省略,会复用前面一项的表达式和类型
const (
n1 = 100
n2 // 等效 n2 = 100
n3 // 等效 n3 = 100
)
常量声明器 Iota
Iota 的值是 0 开始,逐项加 1
// iota,如果把const当作php里的array,iota就是array的index
// 一行当作php的array数组里的元素
const (
n1 = 10 // 第1行iota就是固定为0
n2 = iota // 第2行iota就是固定为1,等效n2 = 1
n3 // 第3行iota就是固定为2,等效n3 = 2
n4 // 第4行iota就是固定为3,等效n4 = 3
)
const (
a, b = iota + 1, iota + 2 //1,2
c, d //2,3
e, f //3,4
)
无类型常量
常量可以属于任何基本类型,但是也可以是无类型。从属类型待定的常量有 6 种:
- 无类型整数,可以和各类型的整数进行运算,但是不能和其他类型运算
- 无类型浮点数,可以和各类型的浮点数进行运算,但是不能和其他类型运算
- 无类型布尔
- 无类型文字符号
- 无类型复数
- 无类型字符串
借助推迟确定类型,常量可以保存更加高的精度(因为类型有最大值),还能写出更多的表达式,无需类型转换。
var a float32 = 100.1
fmt.Printf("%T", math.Pi) // 是float64
fmt.Println(a / math.Pi) // a是float32和pi可以相除