<div class="blogpost-body" id="cnblogs_post_body">
<h2 id="articleHeader1">1.1 变量</h2>
<p>Go 是静态类型语言,不能在运行期改变变量类型。使用关键字 var 定义变量,自动初始化为零值。如果提供初始化值,可省略变量类型,由编译器自动推断。</p>
<pre class="hljs go"><span class="hljs-keyword">var x <span class="hljs-keyword">int
<span class="hljs-keyword">var f <span class="hljs-keyword">float32 = <span class="hljs-number">1.6
<span class="hljs-keyword">var s = <span class="hljs-string">"abc"</span></span></span></span></span></span></span></pre>
<p>在函数内部,可用更简略的 ":=" 方式定义变量。</p>
<pre class="blockcode"><code class="language-css"><span class="hljs-selector-tag">func <span class="hljs-selector-tag">main() {
<span class="hljs-attribute">x := <span class="hljs-number">123 // 注意检查,是定义新局部变量,还是修改全局变量。该方式容易造成错误。
}</span></span></span></span></code></pre>
<p>可一次定义多个变量。</p>
<pre class="hljs go"><span class="hljs-keyword">var x, y, z <span class="hljs-keyword">int
<span class="hljs-keyword">var s, n = <span class="hljs-string">"abc", <span class="hljs-number">123
<span class="hljs-keyword">var ( a <span class="hljs-keyword">int b <span class="hljs-keyword">float32 ) <span class="hljs-keyword">func main() { n, s := <span class="hljs-number">0x1234, <span class="hljs-string">"Hello, World!" <span class="hljs-built_in">println(x, s, n) }</span></span></span></span></span></span></span></span></span></span></span></span></pre>
<p>多变量赋值时,先计算所有相关值,然后再从左到右依次赋值。</p>
<pre class="hljs fortran"><span class="hljs-keyword">data, i := [<span class="hljs-number">3]<span class="hljs-built_in">int{<!-- --><span class="hljs-number">0, <span class="hljs-number">1, <span class="hljs-number">2}, <span class="hljs-number">0 i, <span class="hljs-keyword">data[i] = <span class="hljs-number">2, <span class="hljs-number">100 // (i = <span class="hljs-number">0) -> (i = <span class="hljs-number">2), (<span class="hljs-keyword">data[<span class="hljs-number">0] = <span class="hljs-number">100)</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<p>特殊只写变量 "_",用于忽略值占位。</p>
<pre class="hljs go"><span class="hljs-keyword">func test() (<span class="hljs-keyword">int, <span class="hljs-keyword">string) {
<span class="hljs-keyword">return <span class="hljs-number">1, <span class="hljs-string">"abc" } <span class="hljs-keyword">func main() { _, s := test() <span class="hljs-built_in">println(s) }</span></span></span></span></span></span></span></span></pre>
<p>编译器会将未使用的局部变量当做错误。</p>
<pre class="hljs go"><span class="hljs-keyword">var s <span class="hljs-keyword">string <span class="hljs-comment">// 全局变量没问题。
<span class="hljs-keyword">func main() {
i := <span class="hljs-number">0 <span class="hljs-comment">// Error: i declared and not used。(可使用 "_ = i" 规避) }</span></span></span></span></span></span></pre>
<p>注意重新赋值与定义新同名变量的区别。</p>
<pre class="hljs go">s := <span class="hljs-string">"abc"
<span class="hljs-built_in">println(&s)
s, y := <span class="hljs-string">"hello", <span class="hljs-number">20 <span class="hljs-comment">// 重新赋值: 与前 s 在同一层次的代码块中,且有新的变量被定义。
<span class="hljs-built_in">println(&s, y) <span class="hljs-comment">// 通常函数多返回值 err 会被重复使用。 { s, z := <span class="hljs-number">1000, <span class="hljs-number">30 <span class="hljs-comment">// 定义新同名变量: 不在同一层次代码块。 <span class="hljs-built_in">println(&s, z) }</span></span></span></span></span></span></span></span></span></span></span></pre>
<p>输出:</p>
<pre class="hljs">0x2210230f30
0x2210230f30 20
0x2210230f18 30</pre>
<h2 id="articleHeader2">1.2 常量</h2>
<p>常量值必须是编译期可确定的数字、字符串、布尔值。</p>
<pre class="hljs go"><span class="hljs-keyword">const x, y <span class="hljs-keyword">int = <span class="hljs-number">1, <span class="hljs-number">2 <span class="hljs-comment">// 多常量初始化
<span class="hljs-keyword">const s = <span class="hljs-string">"Hello, World!" <span class="hljs-comment">// 类型推断 <span class="hljs-keyword">const ( <span class="hljs-comment">// 常量组 a, b = <span class="hljs-number">10, <span class="hljs-number">100 c <span class="hljs-keyword">bool = <span class="hljs-literal">false ) <span class="hljs-keyword">func main() { <span class="hljs-keyword">const x = <span class="hljs-string">"xxx" <span class="hljs-comment">// 未使用局部常量不会引发编译错误。 }</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<p>不支持 1UL、2LL 这样的类型后缀。</p>
<p>在常量组中,如不提供类型和初始化值&#x |
|