贝利信息

Go 中的 const 声明支持作用域内重名(即变量遮蔽),而非重新赋值或修改

日期:2026-01-21 00:00 / 作者:花韻仙語

go 中的 `const` 声明具有词法作用域,同名常量在不同作用域中互不干扰;函数内重新声明的 `const` 会遮蔽外层同名常量,而非覆盖或修改它。

在 Go 语言中,“常量不可变”这一原则始终成立——但关键在于:不可变 ≠ 不可遮蔽。所谓“重声明”(如在 main 函数中再次写 const s = 0)并非修改已存在的常量,而是定义一个新常量,其作用域仅限于当前代码块(如函数体、花括号内的子作用域)。外层声明的 const s string = "constant" 依然存在且未被触碰,只是在 main 函数内部被同名的新常量暂时“遮蔽”(shadowing)了。

这种行为与 Go 中变量(var)的遮蔽规则一致,是语言设计上对作用域清晰性和局部性的重要支持。下面是一个更直观的演示:

package main

import "fmt"

const s string = "global constant" // 包级常量

func main() {
    const s = 0 // 函数级常量:类型为 int,遮蔽外层 s
    fmt.Println(s) // 输出: 0

    {
        const s = 3.14 // 局部块级常量:float64 类型
        fmt.Println(s) // 输出: 3.14
    }

    fmt.Println(s) // 仍输出: 0(回到 main 作用域,非 

global) }

关键要点总结:

⚠️ 注意事项:

理解作用域与遮蔽,是写出清晰、可维护 Go 代码的基础——它让局部逻辑得以封装,同时保障全局常量的稳定性与安全性。