Table of Contents
什么是变量遮蔽
变量遮蔽(Variable Shadowing)是指:内层作用域(函数、代码块等)中声明的变量,与外层同名变量发生冲突。此时内层变量会“盖住”外层变量——在当前作用域内,同名引用都指向内层变量,外层变量暂时不可见。
需要抓住三点:
- 作用域决定可见性:在内层作用域里,同名引用优先指向内层变量。
- 外层变量并未消失:它的值不会被内层赋值改掉;退出内层作用域后,外层变量重新可见。
- 容易埋下隐患:如果本意是改外层变量,却因为遮蔽实际改到了内层变量,就会产生难以察觉的逻辑错误,嵌套越深越危险。
| |
为什么要避免变量遮蔽?
- 可读性变差:同名变量混用时,很难一眼分清当前操作的是哪一个,嵌套代码尤其如此。
- 后期维护成本高:过一段时间再看代码,容易搞不清自己在改哪个变量,修 bug 时反而引入新问题。
- 调试更费劲:问题可能来自“看错了变量”,却不容易第一时间意识到,排查会多绕弯路。
- 容易写错逻辑:误以为在用外层变量,实际操作的是内层变量,程序行为会与预期不符,且这类错误往往不显眼。
如何避免遮蔽
- 命名要有区分度:用能体现用途的名字,减少“顺手复用同名”的机会。
- 尽量缩小作用域:变量声明得越靠近使用处、范围越窄,越不容易被无意遮蔽。
- 小心
:=:Go 里:=很容易在嵌套块中悄悄新建同名变量。需要改外层变量时,应使用=赋值,而不是再声明一次。 - 借助静态检查:用
go vet、shadow等工具检查被遮蔽的变量,能在问题进入运行时之前尽早发现。