Go 语言中所有常量表达式(如 const a = 1 + 1)均在编译阶段完成计算,不产生运行时开销,确保类型安全与性能优化。
go 语言中所有常量表达式(如 `const a = 1 + 1`)均在编译阶段完成计算,不产生运行时开销,确保类型安全与性能优化。
在 Go 中,常量(const)并非简单地“声明一个不可变的变量”,而是属于编译期实体——其值必须是编译期可确定的常量表达式。根据 Go 语言规范中“常量表达式”章节,常量表达式只能包含常量操作数(如字面量、其他常量、某些内置函数如 unsafe.Sizeof),且整个表达式必须在编译时完成求值。
例如:
const (
x = 1 + 1 // ✅ 编译期计算为 2
y = x * 3 // ✅ 基于常量 x,仍为编译期常量(结果为 6)
max = 1 << 10 // ✅ 位运算在编译期完成(结果为 1024)
hello = "Hello" + " " + "World" // ✅ 字符串拼接也是编译期常量
)⚠️ 注意:以下写法非法,因为涉及运行时行为或非常量操作数:
// ❌ 编译错误:cannot use ... (value of type int) as int value in const declaration
func f() int { return 42 }
const z = f() // 函数调用非编译期可求值
// ❌ 错误:len(slice) 不是常量
s := []int{1, 2}
const n = len(s) // len 仅对数组/字符串字面量长度才允许用于常量
// ❌ 变量不能参与常量表达式
v := 5
const c = v + 1 // 编译失败:v 是变量,不是常量✅ 正确利用编译期常量可提升代码安全性与效率:
- 类型推导更精准(如 const timeout = 5 * time.Second 会推导为 time.Duration);
- 避免重复计算,无运行时内存或 CPU 开销;
- 支持用在需要编译期确定值的上下文中(如数组长度、switch case 值、类型定义等)。
总之,Go 的常量机制是类型安全、零成本抽象的重要基石——它不是语法糖,而是编译器强制执行的静态约束。


















