zhcn 编程语言 Golang 非公開: Go语言常量和const关键字

Go语言常量和const关键字

Go语言中的常量是使用关键字const来定义的,用于存储不改变的数据。常量是在编译时创建的,即使在函数内定义也是如此,并且只能是布尔值、数值(整数、浮点数、浮点数)。复数)和字符串。由于编译时限制,定义常量的表达式必须是编译器可以计算的常量表达式。

常量定义格式类似于变量声明语法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 是无类型布尔类型,字符串文字是无类型字符串类型。

通俗易懂的《Go语言常量和const关键字》讲解!您必须观看的 2 个最佳视频

【Go言語 超入門コース】06.変数 |変数は、例えるなら「箱」のこと。箱にデータを入れておくことができます【プログラミング初心者向け入門講座】
https://www.youtube.com/watch?v=yYpMaSHiDpk&pp=ygUyIEdvIOiogOiqnuOBruWumuaVsOOBqCBjb25zdCDjgq3jg7zjg6_jg7zjg4kmaGw9SkE%3D
実用Go言語 – Forkwell Library #7
https://www.youtube.com/watch?v=oHj1COkATAQ&pp=ygUyIEdvIOiogOiqnuOBruWumuaVsOOBqCBjb25zdCDjgq3jg7zjg6_jg7zjg4kmaGw9SkE%3D
Go语言中的常量是使用关键字const来定义的,用于存储不改变的数据。常量是在编译时创建的,即使在函数内定义也是如此,并且只能是布尔值、数值(整数、浮点数、浮点数)。复数)和字符串。由于编译时限制,定义常量的表达式必须是编译器可以计算的常量表达式。

常量定义格式类似于变量声明语法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 是无类型布尔类型,字符串文字是无类型字符串类型。

通俗易懂的《Go语言常量和const关键字》讲解!您必须观看的 2 个最佳视频

【Go言語 超入門コース】06.変数 |変数は、例えるなら「箱」のこと。箱にデータを入れておくことができます【プログラミング初心者向け入門講座】
https://www.youtube.com/watch?v=yYpMaSHiDpk&pp=ygUyIEdvIOiogOiqnuOBruWumuaVsOOBqCBjb25zdCDjgq3jg7zjg6_jg7zjg4kmaGw9SkE%3D
実用Go言語 – Forkwell Library #7
https://www.youtube.com/watch?v=oHj1COkATAQ&pp=ygUyIEdvIOiogOiqnuOBruWumuaVsOOBqCBjb25zdCDjgq3jg7zjg6_jg7zjg4kmaGw9SkE%3D