mirror of
https://github.com/gopl-zh/gopl-zh.github.com.git
synced 2025-12-19 12:14:20 +08:00
rebuild
This commit is contained in:
259
ch3/ch3-06.html
259
ch3/ch3-06.html
@@ -48,7 +48,7 @@
|
||||
<body>
|
||||
|
||||
|
||||
<div class="book" data-level="3.6" data-chapter-title="常量" data-filepath="ch3/ch3-06.md" data-basepath=".." data-revision="Wed Dec 16 2015 10:54:29 GMT+0800 (中国标准时间)">
|
||||
<div class="book" data-level="3.6" data-chapter-title="常量" data-filepath="ch3/ch3-06.md" data-basepath=".." data-revision="Mon Dec 21 2015 12:51:02 GMT+0800 (中国标准时间)">
|
||||
|
||||
|
||||
<div class="book-summary">
|
||||
@@ -146,7 +146,7 @@
|
||||
|
||||
<b>0.5.</b>
|
||||
|
||||
緻謝
|
||||
致謝
|
||||
</a>
|
||||
|
||||
|
||||
@@ -212,7 +212,7 @@
|
||||
|
||||
<b>1.3.</b>
|
||||
|
||||
査找重復的行
|
||||
査找重複的行
|
||||
</a>
|
||||
|
||||
|
||||
@@ -227,7 +227,7 @@
|
||||
|
||||
<b>1.4.</b>
|
||||
|
||||
GIF動畫
|
||||
GIF動畵
|
||||
</a>
|
||||
|
||||
|
||||
@@ -257,7 +257,7 @@
|
||||
|
||||
<b>1.6.</b>
|
||||
|
||||
併髮穫取多個URL
|
||||
併發穫取多個URL
|
||||
</a>
|
||||
|
||||
|
||||
@@ -479,7 +479,7 @@
|
||||
|
||||
<b>3.3.</b>
|
||||
|
||||
復數
|
||||
複數
|
||||
</a>
|
||||
|
||||
|
||||
@@ -494,7 +494,7 @@
|
||||
|
||||
<b>3.4.</b>
|
||||
|
||||
佈爾型
|
||||
布爾型
|
||||
</a>
|
||||
|
||||
|
||||
@@ -544,7 +544,7 @@
|
||||
|
||||
<b>4.</b>
|
||||
|
||||
復閤數據類型
|
||||
複合數據類型
|
||||
</a>
|
||||
|
||||
|
||||
@@ -857,7 +857,7 @@
|
||||
|
||||
<b>6.2.</b>
|
||||
|
||||
基於指鍼對象的方法
|
||||
基於指針對象的方法
|
||||
</a>
|
||||
|
||||
|
||||
@@ -887,7 +887,7 @@
|
||||
|
||||
<b>6.4.</b>
|
||||
|
||||
方法值和方法錶達式
|
||||
方法值和方法表達式
|
||||
</a>
|
||||
|
||||
|
||||
@@ -953,7 +953,7 @@
|
||||
|
||||
<b>7.1.</b>
|
||||
|
||||
接口是閤約
|
||||
接口是合約
|
||||
</a>
|
||||
|
||||
|
||||
@@ -1073,7 +1073,7 @@
|
||||
|
||||
<b>7.9.</b>
|
||||
|
||||
示例: 錶達式求值
|
||||
示例: 表達式求值
|
||||
</a>
|
||||
|
||||
|
||||
@@ -1103,7 +1103,7 @@
|
||||
|
||||
<b>7.11.</b>
|
||||
|
||||
基於類型斷言識彆錯誤類型
|
||||
基於類型斷言識别錯誤類型
|
||||
</a>
|
||||
|
||||
|
||||
@@ -1214,7 +1214,7 @@
|
||||
|
||||
<b>8.2.</b>
|
||||
|
||||
示例: 併髮的Clock服務
|
||||
示例: 併發的Clock服務
|
||||
</a>
|
||||
|
||||
|
||||
@@ -1229,7 +1229,7 @@
|
||||
|
||||
<b>8.3.</b>
|
||||
|
||||
示例: 併髮的Echo服務
|
||||
示例: 併發的Echo服務
|
||||
</a>
|
||||
|
||||
|
||||
@@ -1274,7 +1274,7 @@
|
||||
|
||||
<b>8.6.</b>
|
||||
|
||||
示例: 併髮的Web爬蟲
|
||||
示例: 併發的Web爬蟲
|
||||
</a>
|
||||
|
||||
|
||||
@@ -1289,7 +1289,7 @@
|
||||
|
||||
<b>8.7.</b>
|
||||
|
||||
基於select的多路復用
|
||||
基於select的多路複用
|
||||
</a>
|
||||
|
||||
|
||||
@@ -1304,7 +1304,7 @@
|
||||
|
||||
<b>8.8.</b>
|
||||
|
||||
示例: 併髮的字典遍歷
|
||||
示例: 併發的字典遍歷
|
||||
</a>
|
||||
|
||||
|
||||
@@ -1319,7 +1319,7 @@
|
||||
|
||||
<b>8.9.</b>
|
||||
|
||||
併髮的退齣
|
||||
併發的退齣
|
||||
</a>
|
||||
|
||||
|
||||
@@ -1354,7 +1354,7 @@
|
||||
|
||||
<b>9.</b>
|
||||
|
||||
基於共享變量的併髮
|
||||
基於共享變量的併發
|
||||
</a>
|
||||
|
||||
|
||||
@@ -1415,7 +1415,7 @@
|
||||
|
||||
<b>9.4.</b>
|
||||
|
||||
內存衕步
|
||||
內存同步
|
||||
</a>
|
||||
|
||||
|
||||
@@ -1460,7 +1460,7 @@
|
||||
|
||||
<b>9.7.</b>
|
||||
|
||||
示例: 併髮的非阻塞緩存
|
||||
示例: 併發的非阻塞緩存
|
||||
</a>
|
||||
|
||||
|
||||
@@ -1475,7 +1475,7 @@
|
||||
|
||||
<b>9.8.</b>
|
||||
|
||||
Goroutines和綫程
|
||||
Goroutines和線程
|
||||
</a>
|
||||
|
||||
|
||||
@@ -1748,7 +1748,7 @@
|
||||
|
||||
<b>12.1.</b>
|
||||
|
||||
為何需要反射?
|
||||
爲何需要反射?
|
||||
</a>
|
||||
|
||||
|
||||
@@ -1793,7 +1793,7 @@
|
||||
|
||||
<b>12.4.</b>
|
||||
|
||||
示例: 編碼S錶達式
|
||||
示例: 編碼S表達式
|
||||
</a>
|
||||
|
||||
|
||||
@@ -1823,7 +1823,7 @@
|
||||
|
||||
<b>12.6.</b>
|
||||
|
||||
示例: 解碼S錶達式
|
||||
示例: 解碼S表達式
|
||||
</a>
|
||||
|
||||
|
||||
@@ -1975,50 +1975,14 @@
|
||||
|
||||
</li>
|
||||
|
||||
<li class="chapter " data-level="14" data-path="exercise/ex.html">
|
||||
|
||||
|
||||
<a href="../exercise/ex.html">
|
||||
|
||||
<i class="fa fa-check"></i>
|
||||
|
||||
<b>14.</b>
|
||||
|
||||
習題解答
|
||||
</a>
|
||||
|
||||
|
||||
<ul class="articles">
|
||||
|
||||
|
||||
<li class="chapter " data-level="14.1" data-path="exercise/ex-ch1.html">
|
||||
|
||||
|
||||
<a href="../exercise/ex-ch1.html">
|
||||
|
||||
<i class="fa fa-check"></i>
|
||||
|
||||
<b>14.1.</b>
|
||||
|
||||
第一章 入門
|
||||
</a>
|
||||
|
||||
|
||||
</li>
|
||||
|
||||
|
||||
</ul>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="chapter " data-level="15" data-path="errata.html">
|
||||
<li class="chapter " data-level="14" data-path="errata.html">
|
||||
|
||||
|
||||
<a href="../errata.html">
|
||||
|
||||
<i class="fa fa-check"></i>
|
||||
|
||||
<b>15.</b>
|
||||
<b>14.</b>
|
||||
|
||||
勘誤
|
||||
</a>
|
||||
@@ -2060,7 +2024,170 @@
|
||||
<section class="normal" id="section-">
|
||||
|
||||
<h2 id="36-常量">3.6. 常量</h2>
|
||||
<p>TODO</p>
|
||||
<p>常量表達式的值在編譯期計算, 而不是在運行期. 每種常量的潛在類型都是基礎類型: boolean, string, 或數字.</p>
|
||||
<p>一個常量的聲明語句定義了常量的名字, 和變量的聲明語法類似, 常量的值不可脩改, 這樣可以防止在運行期被意外或惡意的脩改. 例如, 常量比變量更適合用於表達像 π 之類的數學常數, 因爲它們的值不會變化:</p>
|
||||
<pre><code class="lang-Go"><span class="hljs-keyword">const</span> pi = <span class="hljs-number">3.14159</span> <span class="hljs-comment">// approximately; math.Pi is a better approximation</span>
|
||||
</code></pre>
|
||||
<p>和變量聲明一樣, 可以批量聲明多個常量; 這比較適合聲明一組相關的常量:</p>
|
||||
<pre><code class="lang-Go"><span class="hljs-keyword">const</span> (
|
||||
e = <span class="hljs-number">2.71828182845904523536028747135266249775724709369995957496696763</span>
|
||||
pi = <span class="hljs-number">3.14159265358979323846264338327950288419716939937510582097494459</span>
|
||||
)
|
||||
</code></pre>
|
||||
<p>許多常量的運算可以在編譯期完成, 這樣可以減少運行時的工作, 也方便其他編譯優化. 當操作數是常量時, 一些運行時的錯誤可以在編譯時發現, 例如整數除零, 字符串索引越界, 任何導致無效浮點數的操作等.</p>
|
||||
<p>常量間的所有算術運算, 邏輯運算和比較運算的結果也是常量, 對常量的類型轉換操作或以下函數調用都是返迴常量結果: len, cap, real, imag, complex, 和 unsafe.Sizeof(§13.1).</p>
|
||||
<p>因爲它們的值是在編譯期就確定的, 因此常量可以是構成類型的一部分, 例如用於指定數組類型的長度:</p>
|
||||
<pre><code class="lang-Go"><span class="hljs-keyword">const</span> IPv4Len = <span class="hljs-number">4</span>
|
||||
|
||||
<span class="hljs-comment">// parseIPv4 parses an IPv4 address (d.d.d.d).</span>
|
||||
<span class="hljs-keyword">func</span> parseIPv4(s <span class="hljs-typename">string</span>) IP {
|
||||
<span class="hljs-keyword">var</span> p [IPv4Len]<span class="hljs-typename">byte</span>
|
||||
<span class="hljs-comment">// ...</span>
|
||||
}
|
||||
</code></pre>
|
||||
<p>一個常量的聲明也可以包含一個類型和一個值, 但是如果沒有顯式指明類型, 那麽將從右邊的表達式推斷類型. 在下面的代碼中, time.Duration 是一個命名類型, 底層類型是 int64, time.Minute 是對應類型的常量. 下面聲明的兩個常量都是 time.Duration 類型, 可以通過 %T 參數打印類型信息:</p>
|
||||
<pre><code class="lang-Go"><span class="hljs-keyword">const</span> noDelay time.Duration = <span class="hljs-number">0</span>
|
||||
<span class="hljs-keyword">const</span> timeout = <span class="hljs-number">5</span> * time.Minute
|
||||
fmt.Printf(<span class="hljs-string">"%T %[1]v\n"</span>, noDelay) <span class="hljs-comment">// "time.Duration 0"</span>
|
||||
fmt.Printf(<span class="hljs-string">"%T %[1]v\n"</span>, timeout) <span class="hljs-comment">// "time.Duration 5m0s</span>
|
||||
fmt.Printf(<span class="hljs-string">"%T %[1]v\n"</span>, time.Minute) <span class="hljs-comment">// "time.Duration 1m0s"</span>
|
||||
</code></pre>
|
||||
<p>如果是批量聲明的常量, 除了第一個外其他常量的右邊的表發生可以省略, 如果省略則表示使用前面的表達式, 對應的常量類型也一樣. 例如:</p>
|
||||
<pre><code class="lang-Go"><span class="hljs-keyword">const</span> (
|
||||
a = <span class="hljs-number">1</span>
|
||||
b
|
||||
c = <span class="hljs-number">2</span>
|
||||
d
|
||||
)
|
||||
|
||||
fmt.Println(a, b, c, d) <span class="hljs-comment">// "1 1 2 2"</span>
|
||||
</code></pre>
|
||||
<p>如果隻是簡單地複製右邊的常量表達式, 併沒有太實用的價值. 但是它可以帶來其他的特性, 那就是 iota 常量生成器.</p>
|
||||
<h3 id="361-iota-常量生成器">3.6.1. iota 常量生成器</h3>
|
||||
<p>常量聲明可以使用 iota 常量生成器, 用於生成一組相似的常量值, 但是不用每行都寫一遍. 在一個 const 聲明語句中, 在開始一行 iota 將會被置爲0, 然後在每一個有常量聲明的行加一.</p>
|
||||
<p>下面是來自 time 包的例子, 它首先定義了Weekday命名類型, 然後爲一週的每天定義一個常量, 從週日0開始. 這種類型一般被稱爲枚舉類型.</p>
|
||||
<pre><code class="lang-Go"><span class="hljs-keyword">type</span> Weekday <span class="hljs-typename">int</span>
|
||||
|
||||
<span class="hljs-keyword">const</span> (
|
||||
Sunday Weekday = <span class="hljs-constant">iota</span>
|
||||
Monday
|
||||
Tuesday
|
||||
Wednesday
|
||||
Thursday
|
||||
Friday
|
||||
Saturday
|
||||
)
|
||||
</code></pre>
|
||||
<p>週一將對應0, 週一爲1, 如此等等.</p>
|
||||
<p>我們也可以在複雜的常量表達式中使用 iota, 下面是來自 net 包的例子, 用於給一個無符號整數的最低5bit的每個bit給定一個名字:</p>
|
||||
<pre><code class="lang-Go"><span class="hljs-keyword">type</span> Flags <span class="hljs-typename">uint</span>
|
||||
|
||||
<span class="hljs-keyword">const</span> (
|
||||
FlagUp Flags = <span class="hljs-number">1</span> << <span class="hljs-constant">iota</span> <span class="hljs-comment">// is up</span>
|
||||
FlagBroadcast <span class="hljs-comment">// supports broadcast access capability</span>
|
||||
FlagLoopback <span class="hljs-comment">// is a loopback interface</span>
|
||||
FlagPointToPoint <span class="hljs-comment">// belongs to a point-to-point link</span>
|
||||
FlagMulticast <span class="hljs-comment">// supports multicast access capability</span>
|
||||
)
|
||||
</code></pre>
|
||||
<p>隨着 iota 的遞增, 每個常量對應表達式 1 << iota, 是連續的2的冪, 分别對應一個bit位置. 使用這些常量可以測試, 設置, 或清除對應的bit位的值:</p>
|
||||
<pre><code class="lang-Go">gopl.io/ch3/netflag
|
||||
|
||||
<span class="hljs-keyword">func</span> IsUp(v Flags) <span class="hljs-typename">bool</span> { <span class="hljs-keyword">return</span> v&FlagUp == FlagUp }
|
||||
<span class="hljs-keyword">func</span> TurnDown(v *Flags) { *v &^= FlagUp }
|
||||
<span class="hljs-keyword">func</span> SetBroadcast(v *Flags) { *v |= FlagBroadcast }
|
||||
<span class="hljs-keyword">func</span> IsCast(v Flags) <span class="hljs-typename">bool</span> { <span class="hljs-keyword">return</span> v&(FlagBroadcast|FlagMulticast) != <span class="hljs-number">0</span> }
|
||||
|
||||
unc main() {
|
||||
<span class="hljs-keyword">var</span> v Flags = FlagMulticast | FlagUp
|
||||
fmt.Printf(<span class="hljs-string">"%b %t\n"</span>, v, IsUp(v)) <span class="hljs-comment">// "10001 true"</span>
|
||||
TurnDown(&v)
|
||||
fmt.Printf(<span class="hljs-string">"%b %t\n"</span>, v, IsUp(v)) <span class="hljs-comment">// "10000 false"</span>
|
||||
SetBroadcast(&v)
|
||||
fmt.Printf(<span class="hljs-string">"%b %t\n"</span>, v, IsUp(v)) <span class="hljs-comment">// "10010 false"</span>
|
||||
fmt.Printf(<span class="hljs-string">"%b %t\n"</span>, v, IsCast(v)) <span class="hljs-comment">// "10010 true"</span>
|
||||
}
|
||||
</code></pre>
|
||||
<p>下面是一個更複雜的例子, 每個常量都是1024的冪:</p>
|
||||
<pre><code class="lang-Go"><span class="hljs-keyword">const</span> (
|
||||
_ = <span class="hljs-number">1</span> << (<span class="hljs-number">10</span> * <span class="hljs-constant">iota</span>)
|
||||
KiB <span class="hljs-comment">// 1024</span>
|
||||
MiB <span class="hljs-comment">// 1048576</span>
|
||||
GiB <span class="hljs-comment">// 1073741824</span>
|
||||
TiB <span class="hljs-comment">// 1099511627776 (exceeds 1 << 32)</span>
|
||||
PiB <span class="hljs-comment">// 1125899906842624</span>
|
||||
EiB <span class="hljs-comment">// 1152921504606846976</span>
|
||||
ZiB <span class="hljs-comment">// 1180591620717411303424 (exceeds 1 << 64)</span>
|
||||
YiB <span class="hljs-comment">// 1208925819614629174706176</span>
|
||||
)
|
||||
</code></pre>
|
||||
<p>iota 機製也有其局限性. 例如, 它併不能用於産生1000的冪(KB,MB,等等), 因爲併沒有計算冪的運算符.</p>
|
||||
<p><strong>練習3.13:</strong> 編寫KB,MB的常量聲明, 然後擴展到YB.</p>
|
||||
<h3 id="362-無類型常量">3.6.2. 無類型常量</h3>
|
||||
<p>Go語言的常量有點不尋常. 雖然一個常量可以有任意有一個確定的基礎類型, 例如 int 或 float64, 或者是類似 time.Duration 這樣命名的基礎類型, 但是許多常量併沒有一個明確的基礎類型. 編譯期爲這些沒有明確的基礎類型的數字常量提供比基礎類型或機器更高精度的算術運算; 你可以認爲至少有256bit的運算精度. 這里有六種未明確類型的常量類型, 分别是 無類型的布爾型, 無類型的整數, 無類型的字符, 無類型的浮點數, 無類型的複數, 無類型的字符串.</p>
|
||||
<p>通過延遲明確具體類型, 無類型的常量不僅可以提供更高的精度, 而且可以直接用於更多的表達式而不需要類型轉換. 例如 例子中的 ZiB 和 YiB 的值已經超齣任何Go中整數類型能表達的范圍, 但是它們依然是合法的常量, 而且可以像下面表達式這樣使用:</p>
|
||||
<pre><code class="lang-Go">fmt.Println(YiB/ZiB) <span class="hljs-comment">// "1024"</span>
|
||||
</code></pre>
|
||||
<p>另一個例子, math.Pi 無類型的浮點數常量, 可以直接用於任意需要浮點數或複數的地方:</p>
|
||||
<pre><code class="lang-Go"><span class="hljs-keyword">var</span> x <span class="hljs-typename">float32</span> = math.Pi
|
||||
<span class="hljs-keyword">var</span> y <span class="hljs-typename">float64</span> = math.Pi
|
||||
<span class="hljs-keyword">var</span> z <span class="hljs-typename">complex128</span> = math.Pi
|
||||
</code></pre>
|
||||
<p>如果 math.Pi 被確定爲特定類型, 比如 float64, 那麽結果精度可能會不一樣, 同時對於需要float32或complex128類型值的地方會需要一個明確的類型轉換:</p>
|
||||
<pre><code class="lang-Go"><span class="hljs-keyword">const</span> Pi64 <span class="hljs-typename">float64</span> = math.Pi
|
||||
|
||||
<span class="hljs-keyword">var</span> x <span class="hljs-typename">float32</span> = <span class="hljs-typename">float32</span>(Pi64)
|
||||
<span class="hljs-keyword">var</span> y <span class="hljs-typename">float64</span> = Pi64
|
||||
<span class="hljs-keyword">var</span> z <span class="hljs-typename">complex128</span> = <span class="hljs-typename">complex128</span>(Pi64)
|
||||
</code></pre>
|
||||
<p>對於常量面值, 不同的寫法對應不同的類型. 例如 0, 0.0, 0i, 和 '\u0000' 雖然有着相同的常量值, 但是它們分别對應無類型的整數,無類型的浮點數,無類型的複數,和無類型的字符等不同的常量類型. 同樣, true 和 false 也是無類型的布爾類型, 字符串面值常量是無類型的字符串.</p>
|
||||
<p>前面説過除法運算符 / 根據操作數的類型生成對應類型的結果. 因此, 不同寫法的常量除法表達式可能對應不同的結果:</p>
|
||||
<pre><code class="lang-Go"><span class="hljs-keyword">var</span> f <span class="hljs-typename">float64</span> = <span class="hljs-number">212</span>
|
||||
fmt.Println((f - <span class="hljs-number">32</span>) * <span class="hljs-number">5</span> / <span class="hljs-number">9</span>) <span class="hljs-comment">// "100"; (f - 32) * 5 is a float64</span>
|
||||
fmt.Println(<span class="hljs-number">5</span> / <span class="hljs-number">9</span> * (f - <span class="hljs-number">32</span>)) <span class="hljs-comment">// "0"; 5/9 is an untyped integer, 0</span>
|
||||
fmt.Println(<span class="hljs-number">5.0</span> / <span class="hljs-number">9.0</span> * (f - <span class="hljs-number">32</span>)) <span class="hljs-comment">// "100"; 5.0/9.0 is an untyped float</span>
|
||||
</code></pre>
|
||||
<p>隻有常量可以是無類型的. 當一個無類型的常量被賦值給一個變量, 就像上面的第一行語句, 或者是像其餘三個語句中右邊表達式中含有明確類型的值, 無類型的常量將會被隱式轉換爲對應的類型, 如果可能的話.</p>
|
||||
<pre><code class="lang-Go"><span class="hljs-keyword">var</span> f <span class="hljs-typename">float64</span> = <span class="hljs-number">3</span> + <span class="hljs-number">0i</span> <span class="hljs-comment">// untyped complex -> float64</span>
|
||||
f = <span class="hljs-number">2</span> <span class="hljs-comment">// untyped integer -> float64</span>
|
||||
f = <span class="hljs-number">1e123</span> <span class="hljs-comment">// untyped floating-point -> float64</span>
|
||||
f = <span class="hljs-string">'a'</span> <span class="hljs-comment">// untyped rune -> float64</span>
|
||||
</code></pre>
|
||||
<p>上面的語句相當於:</p>
|
||||
<pre><code class="lang-Go"><span class="hljs-keyword">var</span> f <span class="hljs-typename">float64</span> = <span class="hljs-typename">float64</span>(<span class="hljs-number">3</span> + <span class="hljs-number">0i</span>)
|
||||
f = <span class="hljs-typename">float64</span>(<span class="hljs-number">2</span>)
|
||||
f = <span class="hljs-typename">float64</span>(<span class="hljs-number">1e123</span>)
|
||||
f = <span class="hljs-typename">float64</span>(<span class="hljs-string">'a'</span>)
|
||||
</code></pre>
|
||||
<p>無論是隱式或顯式, 將一種類型轉換爲另一種類型要求目標可以表示原始值. 對於浮點數和複數, 可能會有舍入處理:</p>
|
||||
<pre><code class="lang-Go"><span class="hljs-keyword">const</span> (
|
||||
deadbeef = <span class="hljs-number">0xdeadbeef</span> <span class="hljs-comment">// untyped int with value 3735928559</span>
|
||||
a = <span class="hljs-typename">uint32</span>(deadbeef) <span class="hljs-comment">// uint32 with value 3735928559</span>
|
||||
b = <span class="hljs-typename">float32</span>(deadbeef) <span class="hljs-comment">// float32 with value 3735928576 (rounded up)</span>
|
||||
c = <span class="hljs-typename">float64</span>(deadbeef) <span class="hljs-comment">// float64 with value 3735928559 (exact)</span>
|
||||
d = <span class="hljs-typename">int32</span>(deadbeef) <span class="hljs-comment">// compile error: constant overflows int32</span>
|
||||
e = <span class="hljs-typename">float64</span>(<span class="hljs-number">1e309</span>) <span class="hljs-comment">// compile error: constant overflows float64</span>
|
||||
f = <span class="hljs-typename">uint</span>(-<span class="hljs-number">1</span>) <span class="hljs-comment">// compile error: constant underflows uint</span>
|
||||
)
|
||||
</code></pre>
|
||||
<p>對於一個沒有顯式類型的變量聲明(包括短變量聲明語法), 無類型的常量會被隱式轉爲默認的變量類型, 就像下面的例子:</p>
|
||||
<pre><code class="lang-Go">i := <span class="hljs-number">0</span> <span class="hljs-comment">// untyped integer; implicit int(0)</span>
|
||||
r := <span class="hljs-string">'\000'</span> <span class="hljs-comment">// untyped rune; implicit rune('\000')</span>
|
||||
f := <span class="hljs-number">0.0</span> <span class="hljs-comment">// untyped floating-point; implicit float64(0.0)</span>
|
||||
c := <span class="hljs-number">0i</span> <span class="hljs-comment">// untyped complex; implicit complex128(0i)</span>
|
||||
</code></pre>
|
||||
<p>註意默認類型是規則的: 無類型的整數常量默認轉換爲int, 對應不確定的尺寸, 但是浮點數好複數常量則默認轉換爲float64和complex128. Go語言本身併沒有不確定的尺寸的浮點數和複數類型, 因爲如何不知道浮點數類型的話很難寫齣正確的數值算法.</p>
|
||||
<p>如果要給變量一個不同的類型, 我們必鬚顯式地將無類型的常量轉化爲所需的類型, 或給聲明的變量指定類型, 像下面例子這樣:</p>
|
||||
<pre><code class="lang-Go"><span class="hljs-keyword">var</span> i = <span class="hljs-typename">int8</span>(<span class="hljs-number">0</span>)
|
||||
<span class="hljs-keyword">var</span> i <span class="hljs-typename">int8</span> = <span class="hljs-number">0</span>
|
||||
</code></pre>
|
||||
<p>當嚐試將這些無類型的常量轉爲一個接口值時(見第7章), 這些默認類型將顯得尤爲重要, 因爲要靠它們明確接口對應的動態類型.</p>
|
||||
<pre><code class="lang-Go">fmt.Printf(<span class="hljs-string">"%T\n"</span>, <span class="hljs-number">0</span>) <span class="hljs-comment">// "int"</span>
|
||||
fmt.Printf(<span class="hljs-string">"%T\n"</span>, <span class="hljs-number">0.0</span>) <span class="hljs-comment">// "float64"</span>
|
||||
fmt.Printf(<span class="hljs-string">"%T\n"</span>, <span class="hljs-number">0i</span>) <span class="hljs-comment">// "complex128"</span>
|
||||
fmt.Printf(<span class="hljs-string">"%T\n"</span>, <span class="hljs-string">'\000'</span>) <span class="hljs-comment">// "int32" (rune)</span>
|
||||
</code></pre>
|
||||
<p>現在我們已經講述了Go語言中全部的基礎數據類型. 下一步將演示如何用基礎數據類型組合成數組或結構體等複雜數據類型, 然後構建用於解決實際編程問題的數據結構, 這將是第四章的討論主題.</p>
|
||||
|
||||
|
||||
</section>
|
||||
@@ -2074,7 +2201,7 @@
|
||||
<a href="../ch3/ch3-05.html" class="navigation navigation-prev " aria-label="Previous page: 字符串"><i class="fa fa-angle-left"></i></a>
|
||||
|
||||
|
||||
<a href="../ch4/ch4.html" class="navigation navigation-next " aria-label="Next page: 復閤數據類型"><i class="fa fa-angle-right"></i></a>
|
||||
<a href="../ch4/ch4.html" class="navigation navigation-next " aria-label="Next page: 複合數據類型"><i class="fa fa-angle-right"></i></a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user