<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Go on Learning Log</title><link>https://learning.lllllan.cn/tags/go/</link><description>Recent content in Go on Learning Log</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Thu, 23 Jul 2026 09:26:21 +0800</lastBuildDate><atom:link href="https://learning.lllllan.cn/tags/go/index.xml" rel="self" type="application/rss+xml"/><item><title>变量遮蔽</title><link>https://learning.lllllan.cn/2026/07/23/variable-shadowing/</link><pubDate>Thu, 23 Jul 2026 09:26:21 +0800</pubDate><guid>https://learning.lllllan.cn/2026/07/23/variable-shadowing/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://medium.com/@shahpershahin/variable-shadowing-in-go-best-practices-to-avoid-confusions-and-bugs-61e03022b54d"&gt;Go 中的变量遮蔽：最佳实践以避免混淆和错误&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="什么是变量遮蔽"&gt;什么是变量遮蔽&lt;/h2&gt;
&lt;p&gt;变量遮蔽（Variable Shadowing）是指：内层作用域（函数、代码块等）中声明的变量，与外层同名变量发生冲突。此时内层变量会“盖住”外层变量——在当前作用域内，同名引用都指向内层变量，外层变量暂时不可见。&lt;/p&gt;
&lt;p&gt;需要抓住三点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;作用域决定可见性&lt;/strong&gt;：在内层作用域里，同名引用优先指向内层变量。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;外层变量并未消失&lt;/strong&gt;：它的值不会被内层赋值改掉；退出内层作用域后，外层变量重新可见。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;容易埋下隐患&lt;/strong&gt;：如果本意是改外层变量，却因为遮蔽实际改到了内层变量，就会产生难以察觉的逻辑错误，嵌套越深越危险。&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;package&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 10&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 5&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 10&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="为什么要避免变量遮蔽"&gt;为什么要避免变量遮蔽？&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;可读性变差&lt;/strong&gt;：同名变量混用时，很难一眼分清当前操作的是哪一个，嵌套代码尤其如此。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;后期维护成本高&lt;/strong&gt;：过一段时间再看代码，容易搞不清自己在改哪个变量，修 bug 时反而引入新问题。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;调试更费劲&lt;/strong&gt;：问题可能来自“看错了变量”，却不容易第一时间意识到，排查会多绕弯路。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;容易写错逻辑&lt;/strong&gt;：误以为在用外层变量，实际操作的是内层变量，程序行为会与预期不符，且这类错误往往不显眼。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="如何避免遮蔽"&gt;如何避免遮蔽&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;命名要有区分度&lt;/strong&gt;：用能体现用途的名字，减少“顺手复用同名”的机会。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;尽量缩小作用域&lt;/strong&gt;：变量声明得越靠近使用处、范围越窄，越不容易被无意遮蔽。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;小心 &lt;code&gt;:=&lt;/code&gt;&lt;/strong&gt;：Go 里 &lt;code&gt;:=&lt;/code&gt; 很容易在嵌套块中悄悄新建同名变量。需要改外层变量时，应使用 &lt;code&gt;=&lt;/code&gt; 赋值，而不是再声明一次。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;借助静态检查&lt;/strong&gt;：用 &lt;code&gt;go vet&lt;/code&gt;、&lt;code&gt;shadow&lt;/code&gt; 等工具检查被遮蔽的变量，能在问题进入运行时之前尽早发现。&lt;/li&gt;
&lt;/ol&gt;</description></item></channel></rss>