Go 语言常量(Constant)详解
在 Go 语言中,常量(Constant) 是指值在程序运行期间不会发生变化的变量。Go 语言使用 const 关键字来定义常量。
1. Go 语言常量的特点
- 必须在编译时确定值,不能由运行时计算得出(例如,函数返回值不能用于常量赋值)。
- 只能是基本数据类型(
bool、string、int、float、complex等)。 - 不能使用
:=语法(Go 语言中:=只能用于变量)。
2. 常量的声明
(1)基本语法
const 常量名 = 值
示例:
package main
import "fmt"
func main() {
const pi = 3.14159
const message = "Hello, Go!"
fmt.Println(pi) // 输出 3.14159
fmt.Println(message) // 输出 Hello, Go!
}
(2)显式类型常量
const a int = 100
const b float64 = 3.14
const c string = "GoLang"
(3)隐式类型常量
const x = 42
const y = "Hello"
在这种情况下,Go 自动推导常量类型。
3. 多个常量的声明
(1)单行声明多个常量
const a, b, c = 1, "Go", 3.14
fmt.Println(a, b, c) // 输出 1 Go 3.14
(2)多行分组声明
const (
name = "Alice"
age = 25
score = 99.5
)
这种方式提高了可读性,推荐使用。
4. 常量的计算
常量可以用于编译期计算:
const (
a = 10
b = 20
c = a + b // 30
)
fmt.Println(c)
但是,常量不能由运行时计算得出:
func getValue() int {
return 100
}
const x = getValue() // ❌ 报错,函数返回值不能用于常量
5. iota 常量生成器
iota 是 Go 语言的常量计数器,默认从 0 开始,每定义一个常量 iota 递增 1。
(1)基础用法
const (
a = iota // 0
b = iota // 1
c = iota // 2
)
fmt.Println(a, b, c) // 输出 0 1 2
(2)简写方式
const (
a = iota // 0
b // 1
c // 2
)
fmt.Println(a, b, c) // 输出 0 1 2
省略 iota,Go 语言会自动推导。
(3)iota 结合位运算
const (
a = 1 << iota // 1 (2^0)
b // 2 (2^1)
c // 4 (2^2)
d // 8 (2^3)
)
fmt.Println(a, b, c, d) // 输出 1 2 4 8
常见用于定义 二进制标志位(Bit Flags)。
(4)iota 遇到中断
如果某行有值,iota 仍会递增:
const (
a = iota // 0
b = 100 // 100(手动赋值)
c = iota // 2(恢复计数)
d // 3(继续计数)
)
fmt.Println(a, b, c, d) // 输出 0 100 2 3
(5)iota 实现枚举
type Weekday int
const (
Sunday Weekday = iota
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
)
fmt.Println(Sunday, Monday, Saturday) // 输出 0 1 6
适用于定义枚举类型。
6. 常量与 var 的区别
| 特性 | 常量(const) | 变量(var) |
|---|---|---|
| 是否可修改 | ❌ 不可修改 | ✅ 可修改 |
| 是否必须初始化 | ✅ 必须初始化 | ❌ 可以不初始化 |
| 运行时计算 | ❌ 不支持 | ✅ 支持 |
| 作用域 | 整个包(局部/全局) | 整个包(局部/全局) |
:= 赋值 | ❌ 不支持 | ✅ 支持 |
7. 总结
| 关键点 | 说明 |
|---|---|
| 常量定义 | 使用 const 关键字 |
| 类型 | 支持 int、float、string、bool |
| 不可变性 | 常量值一旦定义,不能修改 |
| 多常量声明 | 可以使用 const (...) 进行分组 |
| 计算 | 允许编译期计算,但不支持运行时计算 |
| iota | 用于自动递增常量(从 0 开始) |