- 常量表示存储不会改变的数据
- 常量在编译时被创建,即使定义在函数内部也是如此。
- 由于常量只能在编译时被创建,因此定义常量的表达式必须是能被编译器求值的常量表达式。
- 常量使用关键字
const
声明 - 常量只能是布尔型、数字型、字符串型
常量定义
1const name [type] = value
Go语言中可是省略类型说明符type
,编译器可以根据值来推导其类型。
- 显示类型定义:
const pi float32 = 3.14159
- 隐式类型定义:
const pi = 3.14159
常量声明可以包含类型和值,若没有显式指定类型,将从右边表达式推断类型。
常量的值必须能在编译时被确定
1const num = getNumber() //引发构建错误
常量的运算在编译器完成不仅减少了运行时的工作量,也方便其他代码的编译优化。当操作数是常量时,某些运行时错误可以在编译时被发现,比如整数除零、字符串索引越界、无效浮点数操作等。
批量声明
1
2
3
4const ( pi = 3.14152 e = 2.7182818 )
批量声明常量时除了第一个外其它的常量右边的初始化表达式都可以被省略,省略初始化表达式的常量会使用前面常量的初始化表达式的值。
1
2
3
4const ( pi = 3.14159 pi2 )
常量运算
常量之间的算术运算、逻辑运算、比较运算结果也是常量,对常量的类型转换操作结果也是常量。
可用于返回常量结果的函数:len
、cap
、real
、imag
、complex
、unsafe.Sizeof
常量的值是在编译器就确定的,因此常量可以构成类型的一部分。
例如:使用常量指定数组类型的长度
1
2
3
4
5const IPv4Len = 4 func parseIPv4(str string) IP{ var p [IPv4Len]byte }
常量生成器
常量生成器的作用也就是枚举类型
例如:定义一周每天的常量
1
2
3
4
5
6
7
8
9
10
11type Weekday int const ( Sunday Weekday = iota Monday Tuesday Wednesday Thursday Friday Saturday )
- 常量声明时可使用
iota
常量生成器进行初始化 -
iota
用于生成一组以相似规则初始化的常量,但不用每行都写一遍初始化表达式。 - 常量声明语句中,第一个声明常量所在的行,
iota
将会被置为0,然后在每个常量声明的行自增1。
无类型常量
Go语言常量与众不同之处在于,虽然一个常量可以有任意一个确定的基础类型,但许多常量并没有一个明确的基础类型。
例如:使用math.Pi
无类型的浮点数常量,可直接用于任意需要浮点数或复数的地方。
1
2
3var x float32 = math.Pi var y float64 = math.Pi var z complex128 = math.Pi
若math.Pi
被确定为特定类型,那么在计算中精度可能不太一样。
编译器为没有明确基础类型的数字产量提供比基础类型更高精度的算术运算,至少有256bit的运算精度。
未明确类型的常量可分为无类型的布尔型、无类型的整数、无类型的字符、无类型的字符串、无类型的浮点数、无类型的复数
通过延迟明确常量的具体类型,不仅可以提高运算精度,还可以直接用于更多地表达式而无需显式的类型转换。
最后
以上就是怕孤独酒窝最近收集整理的关于Go Constant的全部内容,更多相关Go内容请搜索靠谱客的其他文章。
发表评论 取消回复