Go 中的常量重声明:理解作用域与变量遮蔽机制
技术百科
霞舞
发布时间:2026-01-21
浏览: 次 go 语言允许在不同作用域中使用相同名称重新声明 const,这并非修改原有常量,而是通过作用域隔离实现的“遮蔽(shadowing)”,外层常量保持不变。
在 Go 中,const 声明具有词法作用域(lexical scope),其可见性严格受限于定义所在的作用域块(如函数、代码块 {} 内)。当在内层作用域(例如 main 函数内部)用相同标识符 s 声明一个新的 const 时,它并不会覆盖或修改包级(全局)作用域中已声明的 s,而只是暂时遮蔽(shadow)了外层变量——即在此作用域内,所有对 s 的引用均指向内层声明的版本。
以下示例

package main
import "fmt"
const s string = "constant" // 包级常量,作用域为整个包
func main() {
const s = 0 // 函数级常量,类型由字面量推导为 int;遮蔽了外层 s
fmt.Println(s) // 输出: 0
}更进一步,嵌套作用域也能体现遮蔽的层级性:
package main
import "fmt"
func main() {
const a = 0 // 外层块常量(main 函数作用域)
fmt.Println(a) // → 0
{
const a = 1 // 内层块常量(匿名代码块),遮蔽外层 a
fmt.Println(a) // → 1
}
fmt.Println(a) // → 0(退出内层块后,外层 a 恢复可见)
}⚠️ 注意事项:
- 遮蔽仅发生在不同作用域之间;在同一作用域内重复声明同名 const 会触发编译错误:redeclared in this block。
- const 遮蔽与 var 遮蔽行为一致,但语义更安全——因为常量值不可变,遮蔽不会引发状态不一致问题。
- 尽管技术上可行,但过度使用同名遮蔽会降低代码可读性,建议通过有意义的命名(如 defaultTimeout, maxRetries)避免歧义。
✅ 总结:Go 中“重声明” const 实质是作用域内的遮蔽,而非值的变更。这是语言设计对封装性与灵活性的兼顾,开发者应善用作用域规则,而非将其视为“常量可变”的误解。
# ai
# 将其
# 这是
# 这一
# 也能
# 技术上
# 在此
# 而非
# 有意义
# 见性
# win
# go
# red
# var
# this
# 封装
# 作用域
# 标识符
# const
# 封装性
# 常量
# 低代码
# 编译错误
# 代码可读性
# 这并
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win11怎么关闭防火墙通知_屏蔽Win11安全中
- Win11怎么自动隐藏任务栏_Win11全屏显示设
- Windows10系统服务优化指南_Win10禁用
- Mac的“调度中心”与“空间”怎么用_Mac多桌面
- php8.4如何配置ssl证书_php8.4htt
- 如何在Golang中验证模块完整性_Golangg
- c++如何获取map中所有的键_C++遍历键值对提
- Python 中将 ISO 8601 时间戳转换为
- Python多进程教程_multiprocessi
- Python lxml的etree和Element
- Win11怎么设置默认邮件应用_Windows11
- Win11怎么查看局域网电脑_Windows 11
- VSC怎么创建PHP项目_从零开始搭建项目的步骤【
- LINUX如何开放防火墙端口_Linux fire
- XAMPP 启动失败(Apache 突然停止)的终
- Mac如何开启夜览模式_Mac护眼模式设置与定时
- 如何在 Go 应用中实现自动错误恢复与进程重启机制
- PythonPandas数据分析教程_数据清洗与处
- Mac如何解压zip和rar文件?(推荐免费工具)
- Windows电脑如何进入安全模式?(多种按键方法
- Windows10系统怎么查看运行时间_Win10
- Win11色盲模式怎么开_Win11屏幕颜色滤镜设
- Python路径拼接规范_跨平台处理说明【指导】
- C++ STL算法库怎么用?C++常用算法函数(s
- Win11输入法选字框不见了怎么办_Win11输入
- Python函数接口文档化_自动化说明【指导】
- Win11如何连接Xbox手柄 Win11蓝牙连接
- PHP主流架构怎么集成Redis缓存_配置步骤【方
- Win10怎么卸载金山毒霸_Win10彻底卸载金山
- Win11怎么禁用键盘自带键盘_Win11笔记本禁
- Mac如何彻底清理浏览器缓存?(Safari与Ch
- PythonWeb前后端整合项目教程_FastAP
- c++中如何计算坐标系中两点间距离_c++勾股定理
- php485支持哪些操作系统_php485跨系统支
- Win11如何开启telnet服务 Win11启用
- Python异步编程高级项目教程_asyncio协
- Windows如何拦截腾讯视频广告_Windows
- 如何在 Go 中正确测试带 Cookie 的 HT
- Windows10怎么卸载预装软件_Windows
- 零基础学会Python自动化办公_高效处理Exce
- Win11怎么关闭搜索历史_Win11清除任务栏搜
- 如何在 Go 中创建包含映射(map)的切片(sl
- Mac如何修改Hosts文件?(本地开发与屏蔽网站
- 如何高效获取循环末次生成的 NumPy 数组最后一
- c++ nullptr与NULL区别_c++11空
- Win11怎么打开旧版计算器_Win11恢复传统计
- 如何使用Golang构建基础消息队列模拟_Gola
- LINUX怎么设置系统语言_LINUX修改中文环境
- Win11怎么关闭通知消息_屏蔽Windows 1
- Win11系统占用空间大怎么办 Win11深度瘦身

QQ客服