常量定义格式类似于变量声明语法const name [type] = value 。例如:
const pi = 3.14159
在 Go 中,类型说明符 [type] 可以省略,因为编译器可以从值推断变量的类型。
- 显式类型定义:const b string = “abc”
- 隐式类型定义:const b = “abc”
常量的值必须在编译时确定,其赋值表达式可能涉及计算过程,但计算中使用的所有值必须在编译期间可用。
- 很好的例子 const c1 = 2/3
- 错误示例: const c2 = getNumber() // 发生构建错误: getNumber() 用作值
与变量声明类似,可以批量声明多个常量。
const(
e = 2.7182818、
pi = 3.1415926
) 所有常量操作都可以在编译时执行,这不仅减少了运行时的工作量,还使编译和优化其他代码变得更加容易。一些运行时错误也可能在编译时发现,例如整数除法,如果操作数是常量。诸如零、字符串索引超出范围、导致无效浮点数的操作等。
常量之间的所有算术、逻辑和比较运算的结果也是常量,对常量的类型转换操作或以下函数调用返回常量结果:len、cap、real、imag、complex 和 unsafe.Sizeof。
该值是在编译时确定的,因此常量可以是类型的一部分,例如指定数组类型的长度。
IPv4Len = 4
// parseIPv4はIPv4アドレス(d.d.d.d)を解析します。
func parseIPv4(s string) IP {
var p [IPv4Len]byte
// ...
} 常量声明还可以包含类型和值,但如果未显式指定类型,则从右侧的表达式推断类型。在下面的代码中,time.Duration是一个命名类型,底层类型是int64,time.Minute是相应类型的常量。下面声明的两个常量都是time.Duration类型,可以通过%T参数输出类型信息。
const noDelay time.Duration = 0
const timeout = 5 * time.Minute
fmt.Printf("%T %[1]v\n", noDelay) // "time.Duration 0"
fmt.Printf("%T %[1]v\n", timeout) // "time.Duration 5m0s"
fmt.Printf("%T %[1]v\n", time.Minute) // "time.Duration 1m0s"
コードスニペットを翻訳します。 对于批量声明的常量,除了第一个常量之外的其他常量右侧的初始化表达式可以省略。如果省略初始化表达式,则使用前一个常量的初始化表达式,并使用其对应的初始化表达式。对于常量类型也是如此。例如:
const(
a = 1
b
c = 2
d
)
fmt.Println(a、b、c、d) //「1 1 2 2」 简单地复制右边的常量表达式不太实用。但它还带来了其他功能,这就是 iota 常量生成器语法。
iota常数发生器
常量声明可以使用 iota 常量生成器进行初始化。 iota常量生成器用于生成一组使用类似规则初始化的常量,但无需为每一行编写初始化表达式。在 const 声明语句中,iota 在放置第一个声明常量的行上设置为 0,并在每有一个常量声明的行上加 1。
[示例 1] 首先定义 Weekday 命名类型,然后为从星期日 0 开始的一周中的每一天定义常量。在其他编程语言中,这种类型通常称为枚举。
型 Weekday int
const (
Sunday Weekday = iota
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
) 对应于周日的 0,周一的 1,依此类推。
无类型常量
Go 中的常量有些不寻常。常量可以具有明确的基础类型,例如 int 或 float64 或 time.Duration,但许多常量没有明确的基础类型。
对于这些不存在明确定义的基类型的数值常量,编译器提供比基类型更高精度的算术运算。这被认为具有至少 256 位的算术精度。这里有六种未指定的常量类型。它们是无类型布尔值、无类型整数、无类型字符、无类型浮点数、无类型复数和无类型字符串。
推迟常量的具体类型以消除歧义不仅可以提高算术精度,还可以使其直接在更多表达式中使用,而无需显式类型转换。
[示例 2] math.Pi 是一个无类型浮点常量,可以在需要浮点或复数的任何地方直接使用。
var x float32 = math.Pi
var y float64 = math.Pi
var z complex128 = math.Pi 如果 math.Pi 被确定为特定类型,例如 float64,则结果的精度可能会有所不同,如果想要 float32 或 complex128 类型的值,则需要显式转换。
const Pi64 float64 = math.Pi
var x float32 = float32(Pi64)
var y float64 = Pi64
var z complex128 = complex128(Pi64) 对于常量字面量,不同的写法可能对应不同的类型。例如,0、0.0、0i 和 \u0000 具有相同的常量值,但各自对应不同的常量类型,例如无类型整数、无类型浮点数、无类型复数和无类型字符。同样,true 和 false 是无类型布尔类型,字符串文字是无类型字符串类型。




![2021 年如何设置 Raspberry Pi Web 服务器 [指南]](https://i0.wp.com/pcmanabu.com/wp-content/uploads/2019/10/web-server-02-309x198.png?w=1200&resize=1200,0&ssl=1)

