常量

Constants 常量

原文:https://go.dev/ref/spec#Constants

​ 有布尔常量、符文常量、整数常量、浮点常量、复数常量和字符串常量。符文、整数、浮点和复数常量统称为数值常量

​ 常量值由一个符文字面量整数字面量浮点数字面量虚数字面量字符串字面量,表示常量的标识符,常量表达式,结果为常量的转换,或一些内置函数的结果值表示,如unsafe.Sizeof应用于某些值,caplen应用于一些表达式,realimag应用于复数常量,complex应用于数值常量。布尔真值由预先声明的常数truefalse表示。预先声明的标识符iota表示一个整数常量。

​ 通常,复数常量是常量表达式的一种形式,将在该节中讨论。

​ 数值常量表示任意精度的精确值,不会溢出。因此,不存在表示IEEE-754负零、无穷大和非数字值的常量。

​ 常量可以是有类型的的或无类型的。字面常量truefalseiota,以及某些只包含无类型的常量操作数的常量表达式是无类型的。

​ 常量可以通过常量声明转换显式地给出类型,也可以在变量声明赋值语句 、作为表达式的操作数时,隐式赋予类型。如果常量值不能被表示为相应类型的值,那就是一个错误。如果类型是一个类型参数,常量将被转换为类型参数的一个非常量值。

​ 一个无类型常量有一个默认的类型,该类型是在需要类型化值的上下文中隐式转换为的类型,例如,在一个短变量声明中,如i := 0,没有明确的类型。无类型常量的默认类型分别是bool, rune, int, float64, complex128string,具体取决于它是一个布尔型常量、rune型常量、整数型常量、浮点型常量、复数型常量还是字符串型常量。

​ 实现限制:尽管数值常量在语言中具有任意的精度,但编译器可以使用有限精度的内部表示法来实现它们。也就是说,每个实现都必须:

  • 用至少256位来表示整数常量。
  • 用至少256位的尾数和至少16位的有符号二进制指数来表示浮点常量,包括复数常量的对应部分。
  • 如果不能精确表示一个整数常量,则给出一个错误。
  • 如果由于溢出而无法表示一个浮点常量或复数常量,则给出一个错误。
  • 如果由于精度的限制,无法表示一个浮点常量或复数常量,则四舍五入到最接近的可表示常量。

​ 这些要求既适用于字面常量,也适用于常量表达式的计算结果。