This commit is contained in:
chai2010
2015-12-21 12:55:18 +08:00
parent 1d7534e3c3
commit 7ec2f7cdc1
152 changed files with 54426 additions and 8958 deletions

View File

@@ -48,7 +48,7 @@
<body>
<div class="book" data-level="11.1" data-chapter-title="go test" data-filepath="ch11/ch11-01.md" data-basepath=".." data-revision="Wed Dec 16 2015 10:54:29 GMT+0800 (中国标准时间)">
<div class="book" data-level="11.1" data-chapter-title="go test" data-filepath="ch11/ch11-01.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,9 +2024,9 @@
<section class="normal" id="section-">
<h2 id="111-go-test">11.1. go test</h2>
<p><code>go test</code> &#x662F;&#x4E00;&#x500B;&#x6309;&#x7167;&#x4E00;&#x5B9A;&#x7684;&#x7D04;&#x5B9A;&#x548C;&#x7D44;&#x7E54;&#x7684;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x7684;&#x9A45;&#x52D5;&#x7A0B;&#x5E8F;. &#x5728;&#x5305;&#x76EE;&#x9304;&#x5167;, &#x4EE5; <code>_test.go</code> &#x7232;&#x5F8C;&#x7DB4;&#x540D;&#x7684;&#x6E90;&#x6587;&#x4EF6;&#x4E26;&#x4E0D;&#x662F;<code>go build</code>&#x69CB;&#x5EFA;&#x5305;&#x7684;&#x4EE5;&#x90E8;&#x5206;, &#x5B83;&#x5011;&#x662F; <code>go test</code> &#x6E2C;&#x8A66;&#x7684;&#x4E00;&#x90E8;&#x5206;.</p>
<p>&#x65E9; <code>*_test.go</code> &#x6587;&#x4EF6;&#x4E2D;, &#x6709;&#x4E09;&#x7A2E;&#x985E;&#x578B;&#x7684;&#x51FD;&#x6578;: &#x6E2C;&#x8A66;&#x51FD;&#x6578;, &#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x51FD;&#x6578;, &#x4F8B;&#x5B50;&#x51FD;&#x6578;. &#x4E00;&#x500B;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x662F;&#x4EE5; Test &#x7232;&#x51FD;&#x6578;&#x540D;&#x524D;&#x7DB4;&#x7684;&#x51FD;&#x6578;, &#x7528;&#x65BC;&#x6E2C;&#x8A66;&#x7A0B;&#x5E8F;&#x7684;&#x4E00;&#x4E9B;&#x908F;&#x8F2F;&#x884C;&#x7232;&#x662F;&#x5426;&#x6B63;&#x78BA;; <code>go test</code> &#x6703;&#x8ABF;&#x7528;&#x9019;&#x4E9B;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x4E26;&#x5831;&#x544A;&#x6E2C;&#x8A66;&#x7D50;&#x679C;&#x662F; PASS &#x6216; FAIL. &#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x662F;&#x4EE5;Benchmark&#x7232;&#x51FD;&#x6578;&#x540D;&#x524D;&#x7DB4;&#x7684;&#x51FD;&#x6578;, &#x7528;&#x65BC;&#x8861;&#x91CF;&#x4E00;&#x4E9B;&#x51FD;&#x6578;&#x7684;&#x6027;&#x80FD;; <code>go test</code> &#x6703;&#x591A;&#x6B21;&#x904B;&#x884C;&#x57FA;&#x6E96;&#x51FD;&#x6578;&#x4EE5;&#x8A08;&#x7B97;&#x4E00;&#x500B;&#x5E73;&#x5747;&#x7684;&#x57F7;&#x884C;&#x6642;&#x9593;. &#x4F8B;&#x5B50;&#x51FD;&#x6578;&#x662F;&#x4EE5;Example&#x7232;&#x51FD;&#x6578;&#x540D;&#x524D;&#x7DB4;&#x7684;&#x51FD;&#x6578;, &#x63D0;&#x4F9B;&#x4E00;&#x500B;&#x7531;&#x6A5F;&#x5668;&#x6AA2;&#x6E2C;&#x6B63;&#x78BA;&#x6027;&#x7684;&#x4F8B;&#x5B50;&#x6587;&#x6A94;. &#x6211;&#x5011;&#x5C07;&#x5728; 11.2 &#x7BC0; &#x8A0E;&#x8AD6;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x7684;&#x7D30;&#x7BC0;, &#x5728; 11.4 &#x7BC0;&#x8A0E;&#x8AD6;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x7684;&#x7D30;&#x7BC0;, &#x5728; 11.6 &#x8A0E;&#x8AD6;&#x4F8B;&#x5B50;&#x51FD;&#x6578;&#x7684;&#x7D30;&#x7BC0;.</p>
<p><code>go test</code> &#x547D;&#x4EE4;&#x6703;&#x904D;&#x6B77;&#x6240;&#x6709;&#x7684; <code>*_test.go</code> &#x6587;&#x4EF6;&#x4E2D;&#x4E0A;&#x8FF0;&#x51FD;&#x6578;, &#x7136;&#x5F8C;&#x751F;&#x6210;&#x4E00;&#x500B;&#x81E8;&#x6642;&#x7684;main&#x5305;&#x8ABF;&#x7528;&#x76F8;&#x61C9;&#x7684;&#x6E2C;&#x8A66;&#x51FD;&#x6578;, &#x7136;&#x5F8C;&#x69CB;&#x5EFA;&#x4E26;&#x904B;&#x884C;, &#x5831;&#x544A;&#x6E2C;&#x8A66;&#x7D50;&#x679C;, &#x6700;&#x5F8C;&#x6E05;&#x7406;&#x81E8;&#x6642;&#x6587;&#x4EF6;.</p>
<p><code>go test</code> &#x662F;&#x4E00;&#x500B;&#x6309;&#x7167;&#x4E00;&#x5B9A;&#x7684;&#x7D04;&#x5B9A;&#x548C;&#x7D44;&#x7E54;&#x7684;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x7684;&#x9A45;&#x52D5;&#x7A0B;&#x5E8F;. &#x5728;&#x5305;&#x76EE;&#x9332;&#x5167;, &#x4EE5; <code>_test.go</code> &#x7232;&#x5F8C;&#x7DB4;&#x540D;&#x7684;&#x6E90;&#x6587;&#x4EF6;&#x4F75;&#x4E0D;&#x662F;<code>go build</code>&#x69CB;&#x5EFA;&#x5305;&#x7684;&#x4EE5;&#x90E8;&#x5206;, &#x5B83;&#x5011;&#x662F; <code>go test</code> &#x6E2C;&#x8A66;&#x7684;&#x4E00;&#x90E8;&#x5206;.</p>
<p>&#x65E9; <code>*_test.go</code> &#x6587;&#x4EF6;&#x4E2D;, &#x6709;&#x4E09;&#x7A2E;&#x985E;&#x578B;&#x7684;&#x51FD;&#x6578;: &#x6E2C;&#x8A66;&#x51FD;&#x6578;, &#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x51FD;&#x6578;, &#x4F8B;&#x5B50;&#x51FD;&#x6578;. &#x4E00;&#x500B;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x662F;&#x4EE5; Test &#x7232;&#x51FD;&#x6578;&#x540D;&#x524D;&#x7DB4;&#x7684;&#x51FD;&#x6578;, &#x7528;&#x65BC;&#x6E2C;&#x8A66;&#x7A0B;&#x5E8F;&#x7684;&#x4E00;&#x4E9B;&#x908F;&#x8F2F;&#x884C;&#x7232;&#x662F;&#x5426;&#x6B63;&#x78BA;; <code>go test</code> &#x6703;&#x8ABF;&#x7528;&#x9019;&#x4E9B;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x4F75;&#x5831;&#x544A;&#x6E2C;&#x8A66;&#x7D50;&#x679C;&#x662F; PASS &#x6216; FAIL. &#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x662F;&#x4EE5;Benchmark&#x7232;&#x51FD;&#x6578;&#x540D;&#x524D;&#x7DB4;&#x7684;&#x51FD;&#x6578;, &#x7528;&#x65BC;&#x8861;&#x91CF;&#x4E00;&#x4E9B;&#x51FD;&#x6578;&#x7684;&#x6027;&#x80FD;; <code>go test</code> &#x6703;&#x591A;&#x6B21;&#x904B;&#x884C;&#x57FA;&#x6E96;&#x51FD;&#x6578;&#x4EE5;&#x8A08;&#x7B97;&#x4E00;&#x500B;&#x5E73;&#x5747;&#x7684;&#x57F7;&#x884C;&#x6642;&#x9593;. &#x4F8B;&#x5B50;&#x51FD;&#x6578;&#x662F;&#x4EE5;Example&#x7232;&#x51FD;&#x6578;&#x540D;&#x524D;&#x7DB4;&#x7684;&#x51FD;&#x6578;, &#x63D0;&#x4F9B;&#x4E00;&#x500B;&#x7531;&#x6A5F;&#x5668;&#x6AA2;&#x6E2C;&#x6B63;&#x78BA;&#x6027;&#x7684;&#x4F8B;&#x5B50;&#x6587;&#x6A94;. &#x6211;&#x5011;&#x5C07;&#x5728; 11.2 &#x7BC0; &#x8A0E;&#x8AD6;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x7684;&#x7D30;&#x7BC0;, &#x5728; 11.4 &#x7BC0;&#x8A0E;&#x8AD6;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x7684;&#x7D30;&#x7BC0;, &#x5728; 11.6 &#x8A0E;&#x8AD6;&#x4F8B;&#x5B50;&#x51FD;&#x6578;&#x7684;&#x7D30;&#x7BC0;.</p>
<p><code>go test</code> &#x547D;&#x4EE4;&#x6703;&#x904D;&#x6B77;&#x6240;&#x6709;&#x7684; <code>*_test.go</code> &#x6587;&#x4EF6;&#x4E2D;&#x4E0A;&#x8FF0;&#x51FD;&#x6578;, &#x7136;&#x5F8C;&#x751F;&#x6210;&#x4E00;&#x500B;&#x81E8;&#x6642;&#x7684;main&#x5305;&#x8ABF;&#x7528;&#x76F8;&#x61C9;&#x7684;&#x6E2C;&#x8A66;&#x51FD;&#x6578;, &#x7136;&#x5F8C;&#x69CB;&#x5EFA;&#x4F75;&#x904B;&#x884C;, &#x5831;&#x544A;&#x6E2C;&#x8A66;&#x7D50;&#x679C;, &#x6700;&#x5F8C;&#x6E05;&#x7406;&#x81E8;&#x6642;&#x6587;&#x4EF6;.</p>
</section>

View File

@@ -1,11 +1,11 @@
### 11.2.1. 隨機測試
格驅動的測試便於構造基於精心挑選的測試數據的測試用例. 另一種測試思路是隨機測試, 也就是通過構造更廣的隨機輸入來測試探索函數的行爲.
格驅動的測試便於構造基於精心挑選的測試數據的測試用例. 另一種測試思路是隨機測試, 也就是通過構造更廣的隨機輸入來測試探索函數的行爲.
對於一隨機的輸入, 我們如何能知道希望的輸齣結果呢? 這有兩種策略. 第一是編寫另一函數, 使用簡單和清晰的算法, 雖然效率較低但是行爲和要測試的函數一, 然後對相的隨機輸入檢査兩者的輸齣結果. 第二種是生成的隨機輸入的數據遵循特定的模式, 這樣我們就可以知道期望的輸齣的模式.
對於一隨機的輸入, 我們如何能知道希望的輸齣結果呢? 這有兩種策略. 第一是編寫另一函數, 使用簡單和清晰的算法, 雖然效率較低但是行爲和要測試的函數一, 然後對相的隨機輸入檢査兩者的輸齣結果. 第二種是生成的隨機輸入的數據遵循特定的模式, 這樣我們就可以知道期望的輸齣的模式.
的例子使用的是第二種方法: randomPalindrome 函數用於隨機生成迴文字符串.
的例子使用的是第二種方法: randomPalindrome 函數用於隨機生成迴文字符串.
```Go
import "math/rand"
@@ -39,9 +39,9 @@ func TestRandomPalindromes(t *testing.T) {
}
```
雖然隨機測試有不確定因素, 但是它也是至關重要的, 我們可以從失敗測試的日誌穫取足夠的信息. 在我們的例子中, 輸入 IsPalindrome 的 p 參數將告訴我們眞實的數據, 但是對於函數將接受更雜的輸入, 不需要保存所有的輸入, 隻要日誌中簡單地記隨機數種子卽可(像上的方式). 有了這些隨機數初始化種子, 我們可以很容易脩改測試代碼以重現失敗的隨機測試.
雖然隨機測試有不確定因素, 但是它也是至關重要的, 我們可以從失敗測試的日誌穫取足夠的信息. 在我們的例子中, 輸入 IsPalindrome 的 p 參數將告訴我們眞實的數據, 但是對於函數將接受更雜的輸入, 不需要保存所有的輸入, 隻要日誌中簡單地記隨機數種子卽可(像上的方式). 有了這些隨機數初始化種子, 我們可以很容易脩改測試代碼以重現失敗的隨機測試.
通過使用前時間作爲隨機種子, 在整過程中的每次運行測試命令時都將探索新的隨機數據. 如果你使用的是定期運行的自動化測試集成繫統, 隨機測試將特有價值.
通過使用前時間作爲隨機種子, 在整過程中的每次運行測試命令時都將探索新的隨機數據. 如果你使用的是定期運行的自動化測試集成繫統, 隨機測試將特有價值.
**練習 11.3:** TestRandomPalindromes 隻測試了迴文字符串. 編寫新的隨機測試生成器, 用於測試隨機生成的非迴文字符串.

View File

@@ -1,9 +1,9 @@
### 11.2.2. 測試一個命令
對於測試包 `go test` 是一個的有用的工具, 但是稍加努力我們也可以用它來測試可執行程序. 如果一個包的名字是 main, 那麽在構建時會生成一個可執行程序, 不過 main 包可以作一個包被測試器代碼導入.
對於測試包 `go test` 是一個的有用的工具, 但是稍加努力我們也可以用它來測試可執行程序. 如果一個包的名字是 main, 那麽在構建時會生成一個可執行程序, 不過 main 包可以作一個包被測試器代碼導入.
讓我們 2.3.2節 的 echo 程序編寫一個測試. 我們先將程序拆分兩個函數: echo 函數完成眞正的工作, main 函數用於處理命令行輸入參數和echo可能返迴的錯誤.
讓我們 2.3.2節 的 echo 程序編寫一個測試. 我們先將程序拆分兩個函數: echo 函數完成眞正的工作, main 函數用於處理命令行輸入參數和echo可能返迴的錯誤.
```Go
gopl.io/ch11/echo
@@ -42,7 +42,7 @@ func echo(newline bool, sep string, args []string) error {
}
```
在測試中嗎我們可以用各種參數和標標誌調用 echo 函數, 然後檢測它的輸齣是否正確, 我們通過增加參數來減少 echo 函數對全變量的依賴. 我們還增加了一個全侷名為 out 的變量來替代直接使用 os.Stdout, 這樣測試代碼可以根據需要將 out 脩改為不衕的對象以便於檢査. 下就是 echo_test.go 文件中的測試代碼:
在測試中嗎我們可以用各種參數和標標誌調用 echo 函數, 然後檢測它的輸齣是否正確, 我們通過增加參數來減少 echo 函數對全變量的依賴. 我們還增加了一個全局名爲 out 的變量來替代直接使用 os.Stdout, 這樣測試代碼可以根據需要將 out 脩改爲不同的對象以便於檢査. 下就是 echo_test.go 文件中的測試代碼:
```Go
package main
@@ -83,9 +83,9 @@ func TestEcho(t *testing.T) {
}
```
要註意的是測試代碼和品代碼在一個包. 雖然是main包, 也有對應的 main 入口函數, 但是在測試的時候 main 包隻是 TestEcho 測試函數導入的一個普通包, 裡麪 main 函數沒有被導齣是被忽略的.
要註意的是測試代碼和品代碼在一個包. 雖然是main包, 也有對應的 main 入口函數, 但是在測試的時候 main 包隻是 TestEcho 測試函數導入的一個普通包, 里面 main 函數沒有被導齣是被忽略的.
通過將測試放到格中, 我們很容易添加新的測試用例. 讓我通過增加下的測試用例來看看失敗的情況是怎麽樣的:
通過將測試放到格中, 我們很容易添加新的測試用例. 讓我通過增加下的測試用例來看看失敗的情況是怎麽樣的:
```Go
{true, ",", []string{"a", "b", "c"}, "a b c\n"}, // NOTE: wrong expectation!
@@ -101,8 +101,8 @@ FAIL
FAIL gopl.io/ch11/echo 0.006s
```
錯誤信息描述了試的操作(使用Go類似語法), 實際的行, 和期望的行. 通過這樣的錯誤信息, 你可以在檢視代碼之前就很容易定位錯誤的原因.
錯誤信息描述了試的操作(使用Go類似語法), 實際的行, 和期望的行. 通過這樣的錯誤信息, 你可以在檢視代碼之前就很容易定位錯誤的原因.
要註意的是在測試代碼中沒有調用 log.Fatal 或 os.Exit, 因調用這類函數會導程序提前退齣; 調用這些函數的特權應該放在 main 函數中. 如果眞的有以外的事情導函數發送 panic, 測試驅動應該試 recover, 然後將前測試作失敗處理. 如果是可預期的錯誤, 例如非法的用戶輸入, 找不到文件, 或配置文件不等應該通過返迴一個非空的 error 的方式處理. 運的是(上的意外隻是一個插), 我們的 echo 示例是比較簡單的也沒有需要返迴非空error的情況.
要註意的是在測試代碼中沒有調用 log.Fatal 或 os.Exit, 因調用這類函數會導程序提前退齣; 調用這些函數的特權應該放在 main 函數中. 如果眞的有以外的事情導函數發送 panic, 測試驅動應該試 recover, 然後將前測試作失敗處理. 如果是可預期的錯誤, 例如非法的用戶輸入, 找不到文件, 或配置文件不等應該通過返迴一個非空的 error 的方式處理. 運的是(上的意外隻是一個插), 我們的 echo 示例是比較簡單的也沒有需要返迴非空error的情況.

View File

@@ -1,15 +1,15 @@
### 11.2.3. 白盒測試
一個測試分類的方法是基於測試者是否需要了解被測試對象的內部工作原理. 黑盒測試隻需要測試包公開的文檔和API行, 內部實現對測試代碼是透明的. 相反, 白盒測試有訪問包內部函數和數據結構的權限, 因此可以做到一下普通客戶端無法實現的測試. 例如, 一個飽和測試可以在每個操作之後檢測不變量的數據類型. (白盒測試隻是一個傳統的名稱, 其實稱 clear box 會更準確.)
一個測試分類的方法是基於測試者是否需要了解被測試對象的內部工作原理. 黑盒測試隻需要測試包公開的文檔和API行, 內部實現對測試代碼是透明的. 相反, 白盒測試有訪問包內部函數和數據結構的權限, 因此可以做到一下普通客戶端無法實現的測試. 例如, 一個飽和測試可以在每個操作之後檢測不變量的數據類型. (白盒測試隻是一個傳統的名稱, 其實稱 clear box 會更準確.)
黑盒和白盒這兩種測試方法是互補的. 黑盒測試一般更健壯, 隨着軟件實現的完善測試代碼很少需要更新. 它們可以幫助測試者了解眞是客戶的需求, 可以幫助發現API設計的一些不足之處. 相反, 白盒測試則可以對內部一些棘手的實現提供更多的測試覆蓋.
我們已經看到兩種測試的例子. TestIsPalindrome 測試僅僅使用導齣的 IsPalindrome 函數, 因此它是一個黑盒測試. TestEcho 測試則調用了內部的 echo 函數, 且更新了內部的 out 全變量, 這兩個都是未導齣的, 因此它是白盒測試.
我們已經看到兩種測試的例子. TestIsPalindrome 測試僅僅使用導齣的 IsPalindrome 函數, 因此它是一個黑盒測試. TestEcho 測試則調用了內部的 echo 函數, 且更新了內部的 out 全變量, 這兩個都是未導齣的, 因此它是白盒測試.
我們開發TestEcho測試的時候, 我們脩改了 echo 函數使用包級的 out 作輸齣對象, 因此測試代碼可以用另一個實現代替標準輸齣, 這樣可以方便對比 echo 的輸齣數據. 使用類似的技術, 我們可以將品代碼的其他部分也替換一個容易測試的僞對象. 使用僞對象的好處是我們可以方便配置, 容易預測, 更可靠, 也更容易觀察. 時也可以避免一些不良的副作用, 例如更新生數據庫或信用卡消費行.
我們開發TestEcho測試的時候, 我們脩改了 echo 函數使用包級的 out 作輸齣對象, 因此測試代碼可以用另一個實現代替標準輸齣, 這樣可以方便對比 echo 的輸齣數據. 使用類似的技術, 我們可以將品代碼的其他部分也替換一個容易測試的僞對象. 使用僞對象的好處是我們可以方便配置, 容易預測, 更可靠, 也更容易觀察. 時也可以避免一些不良的副作用, 例如更新生數據庫或信用卡消費行.
的代碼演示了用戶提供網絡存儲的web服務中的配額檢測邏輯. 用戶使用了超過 90% 的存儲配額之後將發送提醒郵件.
的代碼演示了用戶提供網絡存儲的web服務中的配額檢測邏輯. 用戶使用了超過 90% 的存儲配額之後將發送提醒郵件.
```Go
gopl.io/ch11/storage1
@@ -50,7 +50,7 @@ func CheckQuota(username string) {
}
```
我們想測試這個代碼, 但是我們不希望發送眞實的郵件. 因此我們將郵件處理邏輯放到一個有的 notifyUser 函數.
我們想測試這個代碼, 但是我們不希望發送眞實的郵件. 因此我們將郵件處理邏輯放到一個有的 notifyUser 函數.
```Go
gopl.io/ch11/storage2
@@ -110,7 +110,7 @@ func TestCheckQuotaNotifiesUser(t *testing.T) {
}
```
有一個問題: 測試函數返迴後, CheckQuota 將不能正常工作, 因 notifyUsers 依然使用的是測試函數的僞發送郵件函數. (更新全對象的時候總會有這種風險.) 我們必鬚脩改測試代碼恢 notifyUsers 原先的狀態以便後續其他的測試沒有影響, 要確保所有的執行路徑後都能恢, 包括測試失敗或 panic 情形. 在這種情況下, 我們建議使用 defer 處理恢的代碼.
有一個問題: 測試函數返迴後, CheckQuota 將不能正常工作, 因 notifyUsers 依然使用的是測試函數的僞發送郵件函數. (更新全對象的時候總會有這種風險.) 我們必鬚脩改測試代碼恢 notifyUsers 原先的狀態以便後續其他的測試沒有影響, 要確保所有的執行路徑後都能恢, 包括測試失敗或 panic 情形. 在這種情況下, 我們建議使用 defer 處理恢的代碼.
```Go
func TestCheckQuotaNotifiesUser(t *testing.T) {
@@ -127,8 +127,8 @@ func TestCheckQuotaNotifiesUser(t *testing.T) {
}
```
這種處理模式可以用來暫時保存和恢所有的全變量, 包括命令行標誌參數, 調試選項, 和優化參數; 安裝和移除導緻生產代碼生一些調試信息的子函數; 還有有些誘導生代碼進入某些重要狀態的改變, 比如 超時, 錯誤, 甚至是一些刻意製造的發行.
這種處理模式可以用來暫時保存和恢所有的全變量, 包括命令行標誌參數, 調試選項, 和優化參數; 安裝和移除導致生産代碼生一些調試信息的子函數; 還有有些誘導生代碼進入某些重要狀態的改變, 比如 超時, 錯誤, 甚至是一些刻意製造的發行.
以這種方式使用全變量是安全的, 因 go test 不會衕時並發地執行多個測試.
以這種方式使用全變量是安全的, 因 go test 不會同時併發地執行多個測試.

View File

@@ -1,20 +1,20 @@
### 11.2.4. 擴展測試包
考慮下這兩個包: net/url 包, 提供了 URL 解析的功能; net/http 包, 提供了web服務和HTTP客戶端的功能. 如我們所料, 上層的 net/http 包依賴下層的 net/url 包. 然後, net/url 包中的一個測試是演示不URL和HTTP客戶端的交互行. 也就是説, 一個下層包的測試代碼導入了上層的包.
考慮下這兩個包: net/url 包, 提供了 URL 解析的功能; net/http 包, 提供了web服務和HTTP客戶端的功能. 如我們所料, 上層的 net/http 包依賴下層的 net/url 包. 然後, net/url 包中的一個測試是演示不URL和HTTP客戶端的交互行. 也就是説, 一個下層包的測試代碼導入了上層的包.
![](../images/ch11-01.png)
這樣的行在 net/url 包的測試代碼中會導包的循環依賴, 正如 圖11.1中上箭頭所示, 時正如我們在 10.1節所説, Go語言規是禁止包的循環依賴的.
這樣的行在 net/url 包的測試代碼中會導包的循環依賴, 正如 圖11.1中上箭頭所示, 時正如我們在 10.1節所説, Go語言規是禁止包的循環依賴的.
我們可以通過測試擴展包的方式解決循環依賴的問題, 也就是在 net/url 包所在的目録聲明一個 url_test 測試擴展包. 其中測試擴展包名的 `_test` 後綴告訴 go test 工具它應該建立一個額外的包來運行測試. 我們將這個擴展測試包的導入路徑視作是 net/url_test 會更容易理解, 但實際上它不能被其他任何包導入.
我們可以通過測試擴展包的方式解決循環依賴的問題, 也就是在 net/url 包所在的目録聲明一個 url_test 測試擴展包. 其中測試擴展包名的 `_test` 後綴告訴 go test 工具它應該建立一個額外的包來運行測試. 我們將這個擴展測試包的導入路徑視作是 net/url_test 會更容易理解, 但實際上它不能被其他任何包導入.
測試擴展包是一個獨立的包, 因此可以導入測試代碼依賴的其他的輔助包; 包內的測試代碼可能無法做到. 在設計層, 測試擴展包是在所以它依賴的包的上層, 正如 圖11.2所示.
測試擴展包是一個獨立的包, 因此可以導入測試代碼依賴的其他的輔助包; 包內的測試代碼可能無法做到. 在設計層, 測試擴展包是在所以它依賴的包的上層, 正如 圖11.2所示.
![](../images/ch11-02.png)
通過迴避循環導入依賴, 擴展測試包可以更靈活的測試, 特是集成測試(需要測試多個組件之間的交互), 可以像普通應用程序那樣自由地導入其他包.
通過迴避循環導入依賴, 擴展測試包可以更靈活的測試, 特是集成測試(需要測試多個組件之間的交互), 可以像普通應用程序那樣自由地導入其他包.
我們可以用 go list 工具査看包對應目録中哪些Go源文件是品代碼, 哪些是包內測試, 還哪些測試擴展包. 我們以 fmt 包作一個例子. GoFiles 錶示產品代碼對應的Go源文件列; 也就是 go build 命令要編譯的部分:
我們可以用 go list 工具査看包對應目録中哪些Go源文件是品代碼, 哪些是包內測試, 還哪些測試擴展包. 我們以 fmt 包作一個例子. GoFiles 表示産品代碼對應的Go源文件列; 也就是 go build 命令要編譯的部分:
{% raw %}
@@ -25,7 +25,7 @@ $ go list -f={{.GoFiles}} fmt
{% endraw %}
TestGoFiles 示的是 fmt 包內部測試測試代碼, 以 _test.go 後綴文件名, 不過隻在測試時被構建:
TestGoFiles 示的是 fmt 包內部測試測試代碼, 以 _test.go 後綴文件名, 不過隻在測試時被構建:
{% raw %}
@@ -36,9 +36,9 @@ $ go list -f={{.TestGoFiles}} fmt
{% endraw %}
包的測試代碼通常都在這些文件中, 不過 fmt 包非如此; 稍後我們再解釋 export_test.go 文件的作用.
包的測試代碼通常都在這些文件中, 不過 fmt 包非如此; 稍後我們再解釋 export_test.go 文件的作用.
XTestGoFiles 示的是屬於測試擴展包的測試代碼, 也就是 fmt_test 包, 因此它們必鬚先導入 fmt 包. 樣, 這些文件也隻是在測試時被構建運行:
XTestGoFiles 示的是屬於測試擴展包的測試代碼, 也就是 fmt_test 包, 因此它們必鬚先導入 fmt 包. 樣, 這些文件也隻是在測試時被構建運行:
{% raw %}
@@ -50,11 +50,11 @@ $ go list -f={{.XTestGoFiles}} fmt
{% endraw %}
有時候測試擴展包需要訪問被測試包內部的代碼, 例如在一個了避免循環導入而被獨立到外部測試擴展包的白盒測試. 在這種情況下, 我們可以通過一些技巧解決: 我們在包內的一個 _test.go 文件中導齣一個內部的實現給測試擴展包. 因這些代碼隻有在測試時纔需要, 因此一般放在 export_test.go 文件中.
有時候測試擴展包需要訪問被測試包內部的代碼, 例如在一個了避免循環導入而被獨立到外部測試擴展包的白盒測試. 在這種情況下, 我們可以通過一些技巧解決: 我們在包內的一個 _test.go 文件中導齣一個內部的實現給測試擴展包. 因這些代碼隻有在測試時纔需要, 因此一般放在 export_test.go 文件中.
例如, fmt 包的 fmt.Scanf 需要 unicode.IsSpace 函數提供的功能. 但是了避免太多的依賴, fmt 包沒有導入包含鉅大格數據的 unicode 包; 相反fmt包有一個叫 isSpace 內部的簡易實現.
例如, fmt 包的 fmt.Scanf 需要 unicode.IsSpace 函數提供的功能. 但是了避免太多的依賴, fmt 包沒有導入包含鉅大格數據的 unicode 包; 相反fmt包有一個叫 isSpace 內部的簡易實現.
了確保 fmt.isSpace 和 unicode.IsSpace 函數的行為一緻, fmt 包謹慎地包含了一個測試. 是一個在測試擴展包內的測試, 因此是無法直接訪問到 isSpace 內部函數的, 因此 fmt 通過一個祕密齣口導齣了 isSpace 函數. export_test.go 文件就是專門用於測試擴展包的祕密齣口.
了確保 fmt.isSpace 和 unicode.IsSpace 函數的行爲一致, fmt 包謹慎地包含了一個測試. 是一個在測試擴展包內的測試, 因此是無法直接訪問到 isSpace 內部函數的, 因此 fmt 通過一個祕密齣口導齣了 isSpace 函數. export_test.go 文件就是專門用於測試擴展包的祕密齣口.
```Go
package fmt
@@ -62,5 +62,5 @@ package fmt
var IsSpace = isSpace
```
這個測試文件沒有定義測試代碼; 它隻是通過 fmt.IsSpace 簡單導齣了內部的 isSpace 函數, 提供給測試擴展包使用. 這個技巧可以廣用於位於測試擴展包的白盒測試.
這個測試文件沒有定義測試代碼; 它隻是通過 fmt.IsSpace 簡單導齣了內部的 isSpace 函數, 提供給測試擴展包使用. 這個技巧可以廣用於位於測試擴展包的白盒測試.

View File

@@ -1,11 +1,11 @@
### 11.2.5. 編寫有效的測試
許多Go新人會驚異與它的極簡的測試框架. 很多其他語言的測試框架都提供了識測試函數的機製(通常使用反射或元數據), 通過設置一些 setupteardown子函數來執行測試用例運行的初始化或之後的清理操作, 時測試工具箱還提供了很多類似assert斷言, 比較值, 格式化輸齣錯誤信息和停止一個識的測試等輔助函數(通常使用異常機製). 雖然這些機製可以使得測試非常簡潔, 但是測試輸齣的日誌卻像火星文一般難以理解. 此外, 雖然測試最終也會輸齣 PASS 或 FAIL 的報告, 但是它們提供的信息格式卻非常不利於代碼維護者快速定位問題, 因失敗的信息的具體含義是非常隱患的, 比如 "assert: 0 == 1" 或 成頁的海量跟蹤日誌.
許多Go新人會驚異與它的極簡的測試框架. 很多其他語言的測試框架都提供了識測試函數的機製(通常使用反射或元數據), 通過設置一些 setupteardown子函數來執行測試用例運行的初始化或之後的清理操作, 時測試工具箱還提供了很多類似assert斷言, 比較值, 格式化輸齣錯誤信息和停止一個識的測試等輔助函數(通常使用異常機製). 雖然這些機製可以使得測試非常簡潔, 但是測試輸齣的日誌卻像火星文一般難以理解. 此外, 雖然測試最終也會輸齣 PASS 或 FAIL 的報告, 但是它們提供的信息格式卻非常不利於代碼維護者快速定位問題, 因失敗的信息的具體含義是非常隱患的, 比如 "assert: 0 == 1" 或 成頁的海量跟蹤日誌.
Go語言的測試風格則形成鮮明對比. 它期望測試者自己完成大部分的工作, 定義函數避免重, 就像普通編程那樣. 編寫測試不是一個機械的填充過程; 一個測試也有自己的接口, 盡管它的維護者也是測試僅有的一個用戶. 一個好的測試不應該引發其他無關的錯誤信息, 它隻要清晰簡潔地描述問題的癥狀卽可, 有時候可能還需要一些上下文信息. 在理想情況下, 維護者可以在不看代碼的情況下就能根據錯誤信息定位錯誤生的原因. 一個好的測試不應該在遇到一點小錯誤就立刻退齣測試, 它應該試報告更多的測試, 因此我們可能從多個失敗測試的模式中發現錯誤生的規律.
Go語言的測試風格則形成鮮明對比. 它期望測試者自己完成大部分的工作, 定義函數避免重, 就像普通編程那樣. 編寫測試不是一個機械的填充過程; 一個測試也有自己的接口, 盡管它的維護者也是測試僅有的一個用戶. 一個好的測試不應該引發其他無關的錯誤信息, 它隻要清晰簡潔地描述問題的癥狀卽可, 有時候可能還需要一些上下文信息. 在理想情況下, 維護者可以在不看代碼的情況下就能根據錯誤信息定位錯誤生的原因. 一個好的測試不應該在遇到一點小錯誤就立刻退齣測試, 它應該試報告更多的測試, 因此我們可能從多個失敗測試的模式中發現錯誤生的規律.
的斷言函數比較兩個值, 然後生成一個通用的錯誤信息, 停止程序. 它很方便使用也確實有效果, 但是噹識彆的時候, 錯誤時打印的信息幾乎是沒有價值的. 它沒有解決問題提供一個很好的入口.
的斷言函數比較兩個值, 然後生成一個通用的錯誤信息, 停止程序. 它很方便使用也確實有效果, 但是當識别的時候, 錯誤時打印的信息幾乎是沒有價值的. 它沒有解決問題提供一個很好的入口.
```Go
import (
@@ -26,7 +26,7 @@ func TestSplit(t *testing.T) {
}
```
從這個意義上説, 斷言函數犯了過早抽象的錯誤: 僅僅測試兩個整數是否相, 而放棄了根據上下文提供更有意義的錯誤信息的做法. 我們可以根據具體的錯誤打印一個更有價值的錯誤信息, 就像下例子那樣. 測試在隻有一次重的模式齣現時引入抽象.
從這個意義上説, 斷言函數犯了過早抽象的錯誤: 僅僅測試兩個整數是否相, 而放棄了根據上下文提供更有意義的錯誤信息的做法. 我們可以根據具體的錯誤打印一個更有價值的錯誤信息, 就像下例子那樣. 測試在隻有一次重的模式齣現時引入抽象.
```Go
func TestSplit(t *testing.T) {
@@ -40,10 +40,10 @@ func TestSplit(t *testing.T) {
}
```
現在的測試不僅報告了調用的具體函數, 它的輸入, 和結果的意義; 且打印的眞實返迴的值和期望返迴的值; 且卽使斷言失敗依然會繼續試運行更多的測試. 一旦我們寫了這樣結構的測試, 下一步自然不是用更多的if語句來擴展測試用例, 我們可以用像 IsPalindrome 的驅動測試那樣來準備更多的 s, sep 測試用例.
現在的測試不僅報告了調用的具體函數, 它的輸入, 和結果的意義; 且打印的眞實返迴的值和期望返迴的值; 且卽使斷言失敗依然會繼續試運行更多的測試. 一旦我們寫了這樣結構的測試, 下一步自然不是用更多的if語句來擴展測試用例, 我們可以用像 IsPalindrome 的驅動測試那樣來準備更多的 s, sep 測試用例.
的例子不需要額外的輔助函數, 如果如果有可以使測試代碼更簡單的方法我們也樂意接受. (我們將在 13.3節 看到一個 reflect.DeepEqual 輔助函數.) 開始一個好的測試的關鍵是通過實現你眞正想要的具體行, 然後纔是考慮然後簡化測試代碼. 最好的結果是直接從庫的抽象接口開始, 針對公共接口編寫一些測試函數.
的例子不需要額外的輔助函數, 如果如果有可以使測試代碼更簡單的方法我們也樂意接受. (我們將在 13.3節 看到一個 reflect.DeepEqual 輔助函數.) 開始一個好的測試的關鍵是通過實現你眞正想要的具體行, 然後纔是考慮然後簡化測試代碼. 最好的結果是直接從庫的抽象接口開始, 針對公共接口編寫一些測試函數.
**練習11.5:**格驅動的技術擴展TestSplit測試, 打印期望的輸齣結果.
**練習11.5:**格驅動的技術擴展TestSplit測試, 打印期望的輸齣結果.

View File

@@ -1,8 +1,8 @@
### 11.2.6. 避免的不穩定的測試
如果一個應用程序對於新齣現的但有效的輸入經常失敗説明程序不夠穩健; 樣如果一個測試僅僅因聲音變化就會導失敗也是不邏輯的. 就像一個不夠穩健的程序會挫敗它的用戶一樣, 一個脆弱性測試樣會激怒它的維護者. 最脆弱的測試代碼會在程序沒有任何變化的時候生不的結果, 時好時壞, 處理它們會耗費大量的時間但是不會得到任何好處.
如果一個應用程序對於新齣現的但有效的輸入經常失敗説明程序不夠穩健; 樣如果一個測試僅僅因聲音變化就會導失敗也是不邏輯的. 就像一個不夠穩健的程序會挫敗它的用戶一樣, 一個脆弱性測試樣會激怒它的維護者. 最脆弱的測試代碼會在程序沒有任何變化的時候生不的結果, 時好時壞, 處理它們會耗費大量的時間但是不會得到任何好處.
一個測試函數生一個雜的輸齣如一個很長的字符串, 或一個精心設計的數據結構, 或一個文件, 它可以用於和預設的golden結果數據對比, 用這種簡單方式寫測試是誘人的. 但是隨着項目的發展, 輸齣的某些部分很可能會發生變化, 盡管很可能是一個改進的實現導的. 而且不僅僅是輸齣部分, 函數復雜復製的輸入部分可能也跟着變化了, 因此測試使用的輸入也就不在有效了.
一個測試函數生一個雜的輸齣如一個很長的字符串, 或一個精心設計的數據結構, 或一個文件, 它可以用於和預設的golden結果數據對比, 用這種簡單方式寫測試是誘人的. 但是隨着項目的發展, 輸齣的某些部分很可能會發生變化, 盡管很可能是一個改進的實現導的. 而且不僅僅是輸齣部分, 函數複雜複製的輸入部分可能也跟着變化了, 因此測試使用的輸入也就不在有效了.
避免脆弱測試代碼的方法是隻檢測你眞正關心的屬性. 保存測試代碼的簡潔和內部結構的穩定. 特是對斷言部分要有所選擇. 不要檢査字符串的全匹配, 但是尋找相關的子字符串, 因某些子字符串在項目的發展中是比較穩定不變的. 通常編寫一個重雜的輸齣中提取必要精華信息以用於斷言是值得的, 雖然這可能會帶來很多前期的工作, 但是它可以幫助迅速及時脩復因為項目演化而導的不邏輯的失敗測試.
避免脆弱測試代碼的方法是隻檢測你眞正關心的屬性. 保存測試代碼的簡潔和內部結構的穩定. 特是對斷言部分要有所選擇. 不要檢査字符串的全匹配, 但是尋找相關的子字符串, 因某些子字符串在項目的發展中是比較穩定不變的. 通常編寫一個重雜的輸齣中提取必要精華信息以用於斷言是值得的, 雖然這可能會帶來很多前期的工作, 但是它可以幫助迅速及時脩複因爲項目演化而導的不邏輯的失敗測試.

View File

@@ -48,7 +48,7 @@
<body>
<div class="book" data-level="11.2" data-chapter-title="測試函數" data-filepath="ch11/ch11-02.md" data-basepath=".." data-revision="Wed Dec 16 2015 10:54:29 GMT+0800 (中国标准时间)">
<div class="book" data-level="11.2" data-chapter-title="測試函數" data-filepath="ch11/ch11-02.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,17 +2024,17 @@
<section class="normal" id="section-">
<h2 id="112-&#x6E2C;&#x8A66;&#x51FD;&#x6578;">11.2. &#x6E2C;&#x8A66;&#x51FD;&#x6578;</h2>
<p>&#x6BCF;&#x7B87;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x5FC5;&#x9808;&#x5C0E;&#x5165; testing &#x5305;. &#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x6709;&#x5982;&#x4E0B;&#x7684;&#x7C3D;&#x540D;:</p>
<p>&#x6BCF;&#x500B;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x5FC5;&#x9B1A;&#x5C0E;&#x5165; testing &#x5305;. &#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x6709;&#x5982;&#x4E0B;&#x7684;&#x7C64;&#x540D;:</p>
<pre><code class="lang-Go"><span class="hljs-keyword">func</span> TestName(t *testing.T) {
<span class="hljs-comment">// ...</span>
}
</code></pre>
<p>&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x7684;&#x540D;&#x5B57;&#x5FC5;&#x9808;&#x4EE5;Test&#x958B;&#x982D;, &#x53EF;&#x9078;&#x7684;&#x5F8C;&#x7DB4;&#x540D;&#x5FC5;&#x9808;&#x4EE5;&#x5927;&#x5BEB;&#x5B57;&#x6BCD;&#x958B;&#x982D;:</p>
<p>&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x7684;&#x540D;&#x5B57;&#x5FC5;&#x9B1A;&#x4EE5;Test&#x958B;&#x982D;, &#x53EF;&#x9078;&#x7684;&#x5F8C;&#x7DB4;&#x540D;&#x5FC5;&#x9B1A;&#x4EE5;&#x5927;&#x5BEB;&#x5B57;&#x6BCD;&#x958B;&#x982D;:</p>
<pre><code class="lang-Go"><span class="hljs-keyword">func</span> TestSin(t *testing.T) { <span class="hljs-comment">/* ... */</span> }
<span class="hljs-keyword">func</span> TestCos(t *testing.T) { <span class="hljs-comment">/* ... */</span> }
<span class="hljs-keyword">func</span> TestLog(t *testing.T) { <span class="hljs-comment">/* ... */</span> }
</code></pre>
<p>&#x5176;&#x4E2D; t &#x53C3;&#x6578;&#x7528;&#x65BC;&#x5831;&#x544A;&#x6E2C;&#x8A66;&#x5931;&#x6557;&#x548C;&#x9644;&#x4EF6;&#x7684;&#x65E5;&#x8A8C;&#x4FE1;&#x606F;. &#x8B93;&#x6211;&#x5011;&#x9802;&#x4E00;&#x7B87;&#x4E00;&#x7B87;&#x5BE6;&#x4F8B;&#x5305; gopl.io/ch11/word1, &#x96BB;&#x6709;&#x4E00;&#x7B87;&#x51FD;&#x6578; IsPalindrome &#x7528;&#x65BC;&#x6AA2;&#x67FB;&#x4E00;&#x7B87;&#x5B57;&#x7B26;&#x4E32;&#x662F;&#x5426;&#x5F9E;&#x524D;&#x56AE;&#x5F8C;&#x548C;&#x5F9E;&#x5F8C;&#x56AE;&#x524D;&#x8B80;&#x90FD;&#x4E00;&#x6A23;. (&#x9019;&#x7B87;&#x5BE6;&#x73FE;&#x5C0D;&#x65BC;&#x4E00;&#x7B87;&#x5B57;&#x7B26;&#x4E32;&#x662F;&#x5426;&#x662F;&#x8FF4;&#x6587;&#x5B57;&#x7B26;&#x4E32;&#x524D;&#x5F8C;&#x91CD;&#x5FA9;&#x6E2C;&#x8A66;&#x4E86;&#x5169;&#x6B21;; &#x6211;&#x5011;&#x7A0D;&#x5F8C;&#x6703;&#x518D;&#x8A0E;&#x8AD6;&#x9019;&#x7B87;&#x554F;&#x984C;.)</p>
<p>&#x5176;&#x4E2D; t &#x53C3;&#x6578;&#x7528;&#x65BC;&#x5831;&#x544A;&#x6E2C;&#x8A66;&#x5931;&#x6557;&#x548C;&#x9644;&#x4EF6;&#x7684;&#x65E5;&#x8A8C;&#x4FE1;&#x606F;. &#x8B93;&#x6211;&#x5011;&#x9802;&#x4E00;&#x500B;&#x4E00;&#x500B;&#x5BE6;&#x4F8B;&#x5305; gopl.io/ch11/word1, &#x96BB;&#x6709;&#x4E00;&#x500B;&#x51FD;&#x6578; IsPalindrome &#x7528;&#x65BC;&#x6AA2;&#x67FB;&#x4E00;&#x500B;&#x5B57;&#x7B26;&#x4E32;&#x662F;&#x5426;&#x5F9E;&#x524D;&#x5411;&#x5F8C;&#x548C;&#x5F9E;&#x5F8C;&#x5411;&#x524D;&#x8B80;&#x90FD;&#x4E00;&#x6A23;. (&#x9019;&#x500B;&#x5BE6;&#x73FE;&#x5C0D;&#x65BC;&#x4E00;&#x500B;&#x5B57;&#x7B26;&#x4E32;&#x662F;&#x5426;&#x662F;&#x8FF4;&#x6587;&#x5B57;&#x7B26;&#x4E32;&#x524D;&#x5F8C;&#x91CD;&#x8907;&#x6E2C;&#x8A66;&#x4E86;&#x5169;&#x6B21;; &#x6211;&#x5011;&#x7A0D;&#x5F8C;&#x6703;&#x518D;&#x8A0E;&#x8AD6;&#x9019;&#x500B;&#x554F;&#x984C;.)</p>
<pre><code class="lang-Go">gopl.io/ch11/word1
<span class="hljs-comment">// Package word provides utilities for word games.</span>
<span class="hljs-keyword">package</span> word
@@ -2086,7 +2050,7 @@
<span class="hljs-keyword">return</span> <span class="hljs-constant">true</span>
}
</code></pre>
<p>&#x5728;&#x76F8;&#x8855;&#x7684;&#x76EE;&#x5F54;&#x4E0B;, word_test.go &#x6587;&#x4EF6;&#x5305;&#x542B;&#x4E86; TestPalindrome &#x548C; TestNonPalindrome &#x5169;&#x7B87;&#x6E2C;&#x8A66;&#x51FD;&#x6578;. &#x6BCF;&#x4E00;&#x7B87;&#x90FD;&#x662F;&#x6E2C;&#x8A66; IsPalindrome &#x662F;&#x5426;&#x7D66;&#x9F63;&#x6B63;&#x78BA;&#x7684;&#x7D50;&#x679C;, &#x4F75;&#x4F7F;&#x7528; t.Error &#x5831;&#x544A;&#x5931;&#x6557;:</p>
<p>&#x5728;&#x76F8;&#x540C;&#x7684;&#x76EE;&#x9332;&#x4E0B;, word_test.go &#x6587;&#x4EF6;&#x5305;&#x542B;&#x4E86; TestPalindrome &#x548C; TestNonPalindrome &#x5169;&#x500B;&#x6E2C;&#x8A66;&#x51FD;&#x6578;. &#x6BCF;&#x4E00;&#x500B;&#x90FD;&#x662F;&#x6E2C;&#x8A66; IsPalindrome &#x662F;&#x5426;&#x7D66;&#x9F63;&#x6B63;&#x78BA;&#x7684;&#x7D50;&#x679C;, &#x4F75;&#x4F7F;&#x7528; t.Error &#x5831;&#x544A;&#x5931;&#x6557;:</p>
<pre><code class="lang-Go"><span class="hljs-keyword">package</span> word
<span class="hljs-keyword">import</span> <span class="hljs-string">&quot;testing&quot;</span>
@@ -2106,11 +2070,11 @@
}
}
</code></pre>
<p><code>go test</code> (&#x6216; <code>go build</code>) &#x547D;&#x4EE4; &#x5982;&#x679C;&#x6C92;&#x6709;&#x53C3;&#x6578;&#x6307;&#x5B9A;&#x5305;&#x90A3;&#x9EBC;&#x5C07;&#x9ED8;&#x8A8D;&#x5BC0;&#x7528;&#x5679;&#x524D;&#x76EE;&#x5F54;&#x5C0D;&#x61C9;&#x7684;&#x5305;. &#x6211;&#x5011;&#x53EF;&#x4EE5;&#x7528;&#x4E0B;&#x9EAB;&#x7684;&#x547D;&#x4EE4;&#x69CB;&#x5EFA;&#x548C;&#x904B;&#x884C;&#x6E2C;&#x8A66;.</p>
<p><code>go test</code> (&#x6216; <code>go build</code>) &#x547D;&#x4EE4; &#x5982;&#x679C;&#x6C92;&#x6709;&#x53C3;&#x6578;&#x6307;&#x5B9A;&#x5305;&#x90A3;&#x9EBD;&#x5C07;&#x9ED8;&#x8A8D;&#x91C7;&#x7528;&#x7576;&#x524D;&#x76EE;&#x9332;&#x5C0D;&#x61C9;&#x7684;&#x5305;. &#x6211;&#x5011;&#x53EF;&#x4EE5;&#x7528;&#x4E0B;&#x9762;&#x7684;&#x547D;&#x4EE4;&#x69CB;&#x5EFA;&#x548C;&#x904B;&#x884C;&#x6E2C;&#x8A66;.</p>
<pre><code>$ cd $GOPATH/src/gopl.io/ch11/word1
$ go test
ok gopl.io/ch11/word1 0.008s
</code></pre><p>&#x9084;&#x6BD4;&#x8F03;&#x6EFF;&#x610F;, &#x6211;&#x5011;&#x904B;&#x884C;&#x4E86;&#x9019;&#x7B87;&#x7A0B;&#x5E8F;, &#x4E0D;&#x904E;&#x6C92;&#x6709;&#x63D0;&#x524D;&#x9000;&#x9F63;&#x662F;&#x56E0;&#x7232;&#x9084;&#x6C92;&#x6709;&#x9047;&#x5230;BUG&#x5831;&#x544A;. &#x4E00;&#x7B87;&#x6CD5;&#x570B;&#x540D;&#x7232; Noelle Eve Elleon &#x7684;&#x7528;&#x6236;&#x62B1;&#x6028; IsPalindrome &#x51FD;&#x6578;&#x4E0D;&#x80FD;&#x8B58;&#x5225; &#x2018;&#x2018;&#xE9;t&#xE9;.&#x2019;&#x2019;. &#x53E6;&#x5916;&#x4E00;&#x7B87;&#x4F86;&#x81EA;&#x7F8E;&#x570B;&#x4E2D;&#x90E8;&#x7528;&#x6236;&#x7684;&#x62B1;&#x6028;&#x662F;&#x4E0D;&#x80FD;&#x8B58;&#x5225; &#x2018;&#x2018;A man, a plan, a canal: Panama.&#x2019;&#x2019;. &#x57F7;&#x884C;&#x7279;&#x6B8A;&#x548C;&#x5C0F;&#x7684;BUG&#x5831;&#x544A;&#x7232;&#x6211;&#x5011;&#x63D0;&#x4F9B;&#x4E86;&#x65B0;&#x7684;&#x66F4;&#x81EA;&#x7136;&#x7684;&#x6E2C;&#x8A66;&#x7528;&#x4F8B;.</p>
</code></pre><p>&#x9084;&#x6BD4;&#x8F03;&#x6EFF;&#x610F;, &#x6211;&#x5011;&#x904B;&#x884C;&#x4E86;&#x9019;&#x500B;&#x7A0B;&#x5E8F;, &#x4E0D;&#x904E;&#x6C92;&#x6709;&#x63D0;&#x524D;&#x9000;&#x9F63;&#x662F;&#x56E0;&#x7232;&#x9084;&#x6C92;&#x6709;&#x9047;&#x5230;BUG&#x5831;&#x544A;. &#x4E00;&#x500B;&#x6CD5;&#x570B;&#x540D;&#x7232; Noelle Eve Elleon &#x7684;&#x7528;&#x6236;&#x62B1;&#x6028; IsPalindrome &#x51FD;&#x6578;&#x4E0D;&#x80FD;&#x8B58;&#x522B; &#x2018;&#x2018;&#xE9;t&#xE9;.&#x2019;&#x2019;. &#x53E6;&#x5916;&#x4E00;&#x500B;&#x4F86;&#x81EA;&#x7F8E;&#x570B;&#x4E2D;&#x90E8;&#x7528;&#x6236;&#x7684;&#x62B1;&#x6028;&#x662F;&#x4E0D;&#x80FD;&#x8B58;&#x522B; &#x2018;&#x2018;A man, a plan, a canal: Panama.&#x2019;&#x2019;. &#x57F7;&#x884C;&#x7279;&#x6B8A;&#x548C;&#x5C0F;&#x7684;BUG&#x5831;&#x544A;&#x7232;&#x6211;&#x5011;&#x63D0;&#x4F9B;&#x4E86;&#x65B0;&#x7684;&#x66F4;&#x81EA;&#x7136;&#x7684;&#x6E2C;&#x8A66;&#x7528;&#x4F8B;.</p>
<pre><code class="lang-Go"><span class="hljs-keyword">func</span> TestFrenchPalindrome(t *testing.T) {
<span class="hljs-keyword">if</span> !IsPalindrome(<span class="hljs-string">&quot;&#xE9;t&#xE9;&quot;</span>) {
t.Error(<span class="hljs-string">`IsPalindrome(&quot;&#xE9;t&#xE9;&quot;) = false`</span>)
@@ -2124,8 +2088,8 @@ ok gopl.io/ch11/word1 0.008s
}
}
</code></pre>
<p>&#x7232;&#x4E86;&#x907F;&#x514D;&#x5169;&#x6B21;&#x8F38;&#x5165;&#x8F03;&#x9577;&#x7684;&#x5B57;&#x7B26;&#x4E32;, &#x6211;&#x5011;&#x4F7F;&#x7528;&#x4E86;&#x63D0;&#x4F9B;&#x4E86;&#x6709;&#x985E;&#x4F3C; Printf &#x683C;&#x5F0F;&#x5316;&#x529F;&#x80FD;&#x7684; Errorf &#x51FD;&#x6578;&#x4F86;&#x5F59;&#x5831;&#x932F;&#x8AA4;&#x7D50;&#x679C;.</p>
<p>&#x5679;&#x6DFB;&#x52A0;&#x4E86;&#x9019;&#x5169;&#x7B87;&#x6E2C;&#x8A66;&#x7528;&#x4F8B;&#x4E4B;&#x5F8C;, <code>go test</code> &#x8FD4;&#x8FF4;&#x4E86;&#x6E2C;&#x8A66;&#x5931;&#x6557;&#x7684;&#x4FE1;&#x606F;.</p>
<p>&#x7232;&#x4E86;&#x907F;&#x514D;&#x5169;&#x6B21;&#x8F38;&#x5165;&#x8F03;&#x9577;&#x7684;&#x5B57;&#x7B26;&#x4E32;, &#x6211;&#x5011;&#x4F7F;&#x7528;&#x4E86;&#x63D0;&#x4F9B;&#x4E86;&#x6709;&#x985E;&#x4F3C; Printf &#x683C;&#x5F0F;&#x5316;&#x529F;&#x80FD;&#x7684; Errorf &#x51FD;&#x6578;&#x4F86;&#x6ED9;&#x5831;&#x932F;&#x8AA4;&#x7D50;&#x679C;.</p>
<p>&#x7576;&#x6DFB;&#x52A0;&#x4E86;&#x9019;&#x5169;&#x500B;&#x6E2C;&#x8A66;&#x7528;&#x4F8B;&#x4E4B;&#x5F8C;, <code>go test</code> &#x8FD4;&#x8FF4;&#x4E86;&#x6E2C;&#x8A66;&#x5931;&#x6557;&#x7684;&#x4FE1;&#x606F;.</p>
<pre><code>$ go test
--- FAIL: TestFrenchPalindrome (0.00s)
word_test.go:28: IsPalindrome(&quot;&#xE9;t&#xE9;&quot;) = false
@@ -2133,9 +2097,9 @@ ok gopl.io/ch11/word1 0.008s
word_test.go:35: IsPalindrome(&quot;A man, a plan, a canal: Panama&quot;) = false
FAIL
FAIL gopl.io/ch11/word1 0.014s
</code></pre><p>&#x5148;&#x7DE8;&#x5BEB;&#x6E2C;&#x8A66;&#x7528;&#x4F8B;&#x4F75;&#x89C0;&#x5BDF;&#x5230;&#x6E2C;&#x8A66;&#x7528;&#x4F8B;&#x89F8;&#x767C;&#x4E86;&#x548C;&#x7528;&#x6236;&#x5831;&#x544A;&#x7684;&#x932F;&#x8AA4;&#x76F8;&#x8855;&#x7684;&#x63CF;&#x8FF0;&#x662F;&#x4E00;&#x7B87;&#x597D;&#x7684;&#x6E2C;&#x8A66;&#x7FD2;&#x6163;. &#x96BB;&#x6709;&#x9019;&#x6A23;, &#x6211;&#x5011;&#x7E94;&#x80FD;&#x5B9A;&#x4F4D;&#x6211;&#x5011;&#x8981;&#x771E;&#x6B63;&#x89E3;&#x6C7A;&#x7684;&#x554F;&#x984C;.</p>
</code></pre><p>&#x5148;&#x7DE8;&#x5BEB;&#x6E2C;&#x8A66;&#x7528;&#x4F8B;&#x4F75;&#x89C0;&#x5BDF;&#x5230;&#x6E2C;&#x8A66;&#x7528;&#x4F8B;&#x89F8;&#x767C;&#x4E86;&#x548C;&#x7528;&#x6236;&#x5831;&#x544A;&#x7684;&#x932F;&#x8AA4;&#x76F8;&#x540C;&#x7684;&#x63CF;&#x8FF0;&#x662F;&#x4E00;&#x500B;&#x597D;&#x7684;&#x6E2C;&#x8A66;&#x7FD2;&#x6163;. &#x96BB;&#x6709;&#x9019;&#x6A23;, &#x6211;&#x5011;&#x7E94;&#x80FD;&#x5B9A;&#x4F4D;&#x6211;&#x5011;&#x8981;&#x771E;&#x6B63;&#x89E3;&#x6C7A;&#x7684;&#x554F;&#x984C;.</p>
<p>&#x5148;&#x5BEB;&#x6E2C;&#x8A66;&#x7528;&#x4F8B;&#x7684;&#x53E6;&#x597D;&#x8655;&#x662F;, &#x904B;&#x884C;&#x6E2C;&#x8A66;&#x901A;&#x5E38;&#x6703;&#x6BD4;&#x624B;&#x5DE5;&#x63CF;&#x8FF0;&#x5831;&#x544A;&#x7684;&#x8655;&#x7406;&#x66F4;&#x5FEB;, &#x9019;&#x8B93;&#x6211;&#x5011;&#x53EF;&#x4EE5;&#x9032;&#x884C;&#x5FEB;&#x901F;&#x5730;&#x8FED;&#x4EE3;. &#x5982;&#x679C;&#x6E2C;&#x8A66;&#x96C6;&#x6709;&#x5F88;&#x591A;&#x904B;&#x884C;&#x7DE9;&#x6162;&#x7684;&#x6E2C;&#x8A66;, &#x6211;&#x5011;&#x53EF;&#x4EE5;&#x901A;&#x904E;&#x96BB;&#x9078;&#x64C7;&#x904B;&#x884C;&#x67D0;&#x4E9B;&#x7279;&#x5B9A;&#x7684;&#x6E2C;&#x8A66;&#x4F86;&#x52A0;&#x5FEB;&#x6E2C;&#x8A66;&#x901F;&#x5EA6;.</p>
<p>&#x53C3;&#x6578; <code>-v</code> &#x7528;&#x65BC;&#x6253;&#x5370;&#x6BCF;&#x7B87;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x7684;&#x540D;&#x5B57;&#x548C;&#x904B;&#x884C;&#x6642;&#x9593;:</p>
<p>&#x53C3;&#x6578; <code>-v</code> &#x7528;&#x65BC;&#x6253;&#x5370;&#x6BCF;&#x500B;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x7684;&#x540D;&#x5B57;&#x548C;&#x904B;&#x884C;&#x6642;&#x9593;:</p>
<pre><code>$ go test -v
=== RUN TestPalindrome
--- PASS: TestPalindrome (0.00s)
@@ -2150,7 +2114,7 @@ FAIL gopl.io/ch11/word1 0.014s
FAIL
exit status 1
FAIL gopl.io/ch11/word1 0.017s
</code></pre><p>&#x53C3;&#x6578; <code>-run</code> &#x662F;&#x4E00;&#x7B87;&#x6B63;&#x5247;&#x9336;&#x9054;&#x5F0F;, &#x96BB;&#x6709;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x540D;&#x88AB;&#x5B83;&#x6B63;&#x78BA;&#x5339;&#x914D;&#x7684;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x7E94;&#x6703;&#x88AB; <code>go test</code> &#x904B;&#x884C;:</p>
</code></pre><p>&#x53C3;&#x6578; <code>-run</code> &#x662F;&#x4E00;&#x500B;&#x6B63;&#x5247;&#x8868;&#x9054;&#x5F0F;, &#x96BB;&#x6709;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x540D;&#x88AB;&#x5B83;&#x6B63;&#x78BA;&#x5339;&#x914D;&#x7684;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x7E94;&#x6703;&#x88AB; <code>go test</code> &#x904B;&#x884C;:</p>
<pre><code>$ go test -v -run=&quot;French|Canal&quot;
=== RUN TestFrenchPalindrome
--- FAIL: TestFrenchPalindrome (0.00s)
@@ -2161,9 +2125,9 @@ FAIL gopl.io/ch11/word1 0.017s
FAIL
exit status 1
FAIL gopl.io/ch11/word1 0.014s
</code></pre><p>&#x5679;&#x7136;, &#x4E00;&#x65E6;&#x6211;&#x5011;&#x5DF2;&#x7D93;&#x8129;&#x5FA9;&#x4E86;&#x5931;&#x6557;&#x7684;&#x6E2C;&#x8A66;&#x7528;&#x4F8B;, &#x5728;&#x6211;&#x5011;&#x63D0;&#x4EA4;&#x4EE3;&#x78BC;&#x66F4;&#x65B0;&#x4E4B;&#x524D;, &#x6211;&#x5011;&#x61C9;&#x8A72;&#x4EE5;&#x4E0D;&#x5E36;&#x53C3;&#x6578;&#x7684; <code>go test</code> &#x547D;&#x4EE4;&#x904B;&#x884C;&#x5168;&#x90E8;&#x7684;&#x6E2C;&#x8A66;&#x7528;&#x4F8B;, &#x4EE5;&#x78BA;&#x4FDD;&#x66F4;&#x65B0;&#x6C92;&#x6709;&#x5F15;&#x5165;&#x65B0;&#x7684;&#x554F;&#x984C;.</p>
<p>&#x6211;&#x5011;&#x73FE;&#x5728;&#x7684;&#x4EFB;&#x52D9;&#x5C31;&#x662F;&#x8129;&#x5FA9;&#x9019;&#x4E9B;&#x932F;&#x8AA4;. &#x7C21;&#x8981;&#x5206;&#x6790;&#x5F8C;&#x767C;&#x73FE;&#x7B2C;&#x4E00;&#x7B87;BUG&#x7684;&#x539F;&#x56E0;&#x662F;&#x6211;&#x5011;&#x5BC0;&#x7528;&#x4E86; byte &#x800C;&#x4E0D;&#x662F; rune &#x5E8F;&#x5217;, &#x6240;&#x4EE5;&#x50CF; &quot;&#xE9;t&#xE9;&quot; &#x4E2D;&#x7684; &#xE9; &#x7B49;&#x975E; ASCII &#x5B57;&#x7B26;&#x4E0D;&#x80FD;&#x6B63;&#x78BA;&#x8655;&#x7406;. &#x7B2C;&#x4E8C;&#x7B87;BUG&#x662F;&#x56E0;&#x7232;&#x6C92;&#x6709;&#x5FFD;&#x7565;&#x7A7A;&#x683C;&#x548C;&#x5B57;&#x6BCD;&#x7684;&#x5927;&#x5C0F;&#x5BEB;&#x5C0E;&#x7DFB;&#x7684;.</p>
<p>&#x937C;&#x5C0D;&#x4E0A;&#x8FF0;&#x5169;&#x7B87;BUG, &#x6211;&#x5011;&#x4ED4;&#x7D30;&#x91CD;&#x5BEB;&#x4E86;&#x51FD;&#x6578;:</p>
</code></pre><p>&#x7576;&#x7136;, &#x4E00;&#x65E6;&#x6211;&#x5011;&#x5DF2;&#x7D93;&#x8129;&#x8907;&#x4E86;&#x5931;&#x6557;&#x7684;&#x6E2C;&#x8A66;&#x7528;&#x4F8B;, &#x5728;&#x6211;&#x5011;&#x63D0;&#x4EA4;&#x4EE3;&#x78BC;&#x66F4;&#x65B0;&#x4E4B;&#x524D;, &#x6211;&#x5011;&#x61C9;&#x8A72;&#x4EE5;&#x4E0D;&#x5E36;&#x53C3;&#x6578;&#x7684; <code>go test</code> &#x547D;&#x4EE4;&#x904B;&#x884C;&#x5168;&#x90E8;&#x7684;&#x6E2C;&#x8A66;&#x7528;&#x4F8B;, &#x4EE5;&#x78BA;&#x4FDD;&#x66F4;&#x65B0;&#x6C92;&#x6709;&#x5F15;&#x5165;&#x65B0;&#x7684;&#x554F;&#x984C;.</p>
<p>&#x6211;&#x5011;&#x73FE;&#x5728;&#x7684;&#x4EFB;&#x52D9;&#x5C31;&#x662F;&#x8129;&#x8907;&#x9019;&#x4E9B;&#x932F;&#x8AA4;. &#x7C21;&#x8981;&#x5206;&#x6790;&#x5F8C;&#x767C;&#x73FE;&#x7B2C;&#x4E00;&#x500B;BUG&#x7684;&#x539F;&#x56E0;&#x662F;&#x6211;&#x5011;&#x91C7;&#x7528;&#x4E86; byte &#x800C;&#x4E0D;&#x662F; rune &#x5E8F;&#x5217;, &#x6240;&#x4EE5;&#x50CF; &quot;&#xE9;t&#xE9;&quot; &#x4E2D;&#x7684; &#xE9; &#x7B49;&#x975E; ASCII &#x5B57;&#x7B26;&#x4E0D;&#x80FD;&#x6B63;&#x78BA;&#x8655;&#x7406;. &#x7B2C;&#x4E8C;&#x500B;BUG&#x662F;&#x56E0;&#x7232;&#x6C92;&#x6709;&#x5FFD;&#x7565;&#x7A7A;&#x683C;&#x548C;&#x5B57;&#x6BCD;&#x7684;&#x5927;&#x5C0F;&#x5BEB;&#x5C0E;&#x81F4;&#x7684;.</p>
<p>&#x91DD;&#x5C0D;&#x4E0A;&#x8FF0;&#x5169;&#x500B;BUG, &#x6211;&#x5011;&#x4ED4;&#x7D30;&#x91CD;&#x5BEB;&#x4E86;&#x51FD;&#x6578;:</p>
<pre><code class="lang-Go">gopl.io/ch11/word2
<span class="hljs-comment">// Package word provides utilities for word games.</span>
<span class="hljs-keyword">package</span> word
@@ -2187,7 +2151,7 @@ FAIL gopl.io/ch11/word1 0.014s
<span class="hljs-keyword">return</span> <span class="hljs-constant">true</span>
}
</code></pre>
<p>&#x8855;&#x6642;&#x6211;&#x5011;&#x4E5F;&#x5C07;&#x4E4B;&#x524D;&#x7684;&#x6240;&#x6709;&#x6E2C;&#x8A66;&#x6578;&#x64DA;&#x95A4;&#x4F75;&#x5230;&#x4E86;&#x4E00;&#x7B87;&#x6E2C;&#x8A66;&#x4E2D;&#x7684;&#x9336;&#x683C;&#x4E2D;.</p>
<p>&#x540C;&#x6642;&#x6211;&#x5011;&#x4E5F;&#x5C07;&#x4E4B;&#x524D;&#x7684;&#x6240;&#x6709;&#x6E2C;&#x8A66;&#x6578;&#x64DA;&#x5408;&#x4F75;&#x5230;&#x4E86;&#x4E00;&#x500B;&#x6E2C;&#x8A66;&#x4E2D;&#x7684;&#x8868;&#x683C;&#x4E2D;.</p>
<pre><code class="lang-Go"><span class="hljs-keyword">func</span> TestIsPalindrome(t *testing.T) {
<span class="hljs-keyword">var</span> tests = []<span class="hljs-keyword">struct</span> {
input <span class="hljs-typename">string</span>
@@ -2217,16 +2181,16 @@ FAIL gopl.io/ch11/word1 0.014s
<p>&#x6211;&#x5011;&#x7684;&#x65B0;&#x6E2C;&#x8A66;&#x963F;&#x90FD;&#x901A;&#x904E;&#x4E86;:</p>
<pre><code>$ go test gopl.io/ch11/word2
ok gopl.io/ch11/word2 0.015s
</code></pre><p>&#x9019;&#x7A2E;&#x9336;&#x683C;&#x9A45;&#x52D5;&#x7684;&#x6E2C;&#x8A66;&#x5728;Go&#x4E2D;&#x5F88;&#x5E38;&#x898B;&#x7684;. &#x6211;&#x5011;&#x5F88;&#x5BB9;&#x6613;&#x60F3;&#x9336;&#x683C;&#x6DFB;&#x52A0;&#x65B0;&#x7684;&#x6E2C;&#x8A66;&#x6578;&#x64DA;, &#x4F75;&#x4E14;&#x5F8C;&#x9EAB;&#x7684;&#x6E2C;&#x8A66;&#x908F;&#x8F2F;&#x4E5F;&#x6C92;&#x6709;&#x5197;&#x9918;, &#x9019;&#x6A23;&#x6211;&#x5011;&#x53EF;&#x4EE5;&#x66F4;&#x597D;&#x5730;&#x5B8C;&#x5584;&#x932F;&#x8AA4;&#x4FE1;&#x606F;.</p>
<p>&#x5931;&#x6557;&#x7684;&#x6E2C;&#x8A66;&#x7684;&#x8F38;&#x9F63;&#x4F75;&#x4E0D;&#x5305;&#x62EC;&#x8ABF;&#x7528; t.Errorf &#x6642;&#x523B;&#x7684;&#x5806;&#x68E7;&#x8ABF;&#x7528;&#x4FE1;&#x606F;. &#x4E0D;&#x50CF;&#x5176;&#x4ED6;&#x8A9E;&#x8A00;&#x6216;&#x6E2C;&#x8A66;&#x6846;&#x67B6;&#x7684; assert &#x65B7;&#x8A00;, t.Errorf &#x8ABF;&#x7528;&#x4E5F;&#x6C92;&#x6709;&#x5F15;&#x8D77; panic &#x6216;&#x505C;&#x6B62;&#x6E2C;&#x8A66;&#x7684;&#x57F7;&#x884C;. &#x537D;&#x4F7F;&#x9336;&#x683C;&#x4E2D;&#x524D;&#x9EAB;&#x7684;&#x6578;&#x64DA;&#x5C0E;&#x7DFB;&#x4E86;&#x6E2C;&#x8A66;&#x7684;&#x5931;&#x6557;, &#x9336;&#x683C;&#x5F8C;&#x9EAB;&#x7684;&#x6E2C;&#x8A66;&#x6578;&#x64DA;&#x4F9D;&#x7136;&#x6703;&#x904B;&#x884C;&#x6E2C;&#x8A66;, &#x56E0;&#x6B64;&#x5728;&#x4E00;&#x7B87;&#x6E2C;&#x8A66;&#x4E2D;&#x6211;&#x5011;&#x53EF;&#x80FD;&#x4E86;&#x89E3;&#x591A;&#x7B87;&#x5931;&#x6557;&#x7684;&#x4FE1;&#x606F;.</p>
<p>&#x5982;&#x679C;&#x6211;&#x5011;&#x771E;&#x7684;&#x9700;&#x8981;&#x505C;&#x6B62;&#x6E2C;&#x8A66;, &#x6216;&#x8A31;&#x662F;&#x56E0;&#x7232;&#x521D;&#x59CB;&#x5316;&#x5931;&#x6557;&#x6216;&#x53EF;&#x80FD;&#x662F;&#x65E9;&#x5148;&#x7684;&#x932F;&#x8AA4;&#x5C0E;&#x7DFB;&#x4E86;&#x5F8C;&#x7E8C;&#x932F;&#x8AA4;&#x7B49;&#x539F;&#x56E0;, &#x6211;&#x5011;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; t.Fatal &#x6216; t.Fatalf &#x505C;&#x6B62;&#x6E2C;&#x8A66;. &#x5B83;&#x5011;&#x5FC5;&#x9808;&#x5728;&#x548C;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x8855;&#x4E00;&#x7B87; goroutine &#x5167;&#x8ABF;&#x7528;.</p>
<p>&#x6E2C;&#x8A66;&#x5931;&#x6557;&#x7684;&#x4FE1;&#x606F;&#x4E00;&#x822C;&#x7684;&#x5F62;&#x5F0F;&#x662F; &quot;f(x) = y, want z&quot;, f(x) &#x89E3;&#x91CB;&#x4E86;&#x5931;&#x6557;&#x7684;&#x64CD;&#x4F5C;&#x548C;&#x5C0D;&#x61C9;&#x7684;&#x8F38;&#x9F63;, y &#x662F;&#x5BE6;&#x969B;&#x7684;&#x904B;&#x884C;&#x7D50;&#x679C;, z &#x662F;&#x671F;&#x671B;&#x7684;&#x6B63;&#x78BA;&#x7684;&#x7D50;&#x679C;. &#x5C31;&#x50CF;&#x524D;&#x9EAB;&#x6AA2;&#x67FB;&#x8FF4;&#x6587;&#x5B57;&#x7B26;&#x4E32;&#x7684;&#x4F8B;&#x5B50;, &#x5BE6;&#x969B;&#x7684;&#x51FD;&#x6578;&#x7528;&#x65BC; f(x) &#x90E8;&#x5206;. &#x5982;&#x679C;&#x986F;&#x793A; x &#x662F;&#x9336;&#x683C;&#x9A45;&#x52D5;&#x578B;&#x6E2C;&#x8A66;&#x4E2D;&#x6BD4;&#x8F03;&#x91CD;&#x8981;&#x7684;&#x90E8;&#x5206;, &#x56E0;&#x7232;&#x8855;&#x4E00;&#x7B87;&#x65B7;&#x8A00;&#x53EF;&#x80FD;&#x5C0D;&#x61C9;&#x4E0D;&#x8855;&#x7684;&#x9336;&#x683C;&#x9805;&#x57F7;&#x884C;&#x591A;&#x6B21;. &#x8981;&#x907F;&#x514D;&#x7121;&#x7528;&#x548C;&#x5197;&#x9918;&#x7684;&#x4FE1;&#x606F;. &#x5728;&#x6E2C;&#x8A66;&#x985E;&#x4F3C; IsPalindrome &#x8FD4;&#x8FF4;&#x4F48;&#x723E;&#x985E;&#x578B;&#x7684;&#x51FD;&#x6578;&#x6642;, &#x53EF;&#x4EE5;&#x5FFD;&#x7565;&#x4F75;&#x6C92;&#x6709;&#x984D;&#x5916;&#x4FE1;&#x606F;&#x7684; z &#x90E8;&#x5206;. &#x5982;&#x679C; x, y &#x6216; z &#x662F; y &#x7684;&#x9577;&#x5EA6;, &#x8F38;&#x9F63;&#x4E00;&#x7B87;&#x76F8;&#x95DC;&#x90E8;&#x5206;&#x7684;&#x7C21;&#x660E;&#x7E3D;&#x7D50;&#x537D;&#x53EF;. &#x6E2C;&#x8A66;&#x7684;&#x4F5C;&#x8005;&#x61C9;&#x8A72;&#x8981;&#x52AA;&#x529B;&#x5E6B;&#x52A9;&#x7A0B;&#x5E8F;&#x54E1;&#x8A3A;&#x65B7;&#x5931;&#x6557;&#x7684;&#x6E2C;&#x8A66;.</p>
</code></pre><p>&#x9019;&#x7A2E;&#x8868;&#x683C;&#x9A45;&#x52D5;&#x7684;&#x6E2C;&#x8A66;&#x5728;Go&#x4E2D;&#x5F88;&#x5E38;&#x898B;&#x7684;. &#x6211;&#x5011;&#x5F88;&#x5BB9;&#x6613;&#x60F3;&#x8868;&#x683C;&#x6DFB;&#x52A0;&#x65B0;&#x7684;&#x6E2C;&#x8A66;&#x6578;&#x64DA;, &#x4F75;&#x4E14;&#x5F8C;&#x9762;&#x7684;&#x6E2C;&#x8A66;&#x908F;&#x8F2F;&#x4E5F;&#x6C92;&#x6709;&#x5197;&#x9918;, &#x9019;&#x6A23;&#x6211;&#x5011;&#x53EF;&#x4EE5;&#x66F4;&#x597D;&#x5730;&#x5B8C;&#x5584;&#x932F;&#x8AA4;&#x4FE1;&#x606F;.</p>
<p>&#x5931;&#x6557;&#x7684;&#x6E2C;&#x8A66;&#x7684;&#x8F38;&#x9F63;&#x4F75;&#x4E0D;&#x5305;&#x62EC;&#x8ABF;&#x7528; t.Errorf &#x6642;&#x523B;&#x7684;&#x5806;&#x68E7;&#x8ABF;&#x7528;&#x4FE1;&#x606F;. &#x4E0D;&#x50CF;&#x5176;&#x4ED6;&#x8A9E;&#x8A00;&#x6216;&#x6E2C;&#x8A66;&#x6846;&#x67B6;&#x7684; assert &#x65B7;&#x8A00;, t.Errorf &#x8ABF;&#x7528;&#x4E5F;&#x6C92;&#x6709;&#x5F15;&#x8D77; panic &#x6216;&#x505C;&#x6B62;&#x6E2C;&#x8A66;&#x7684;&#x57F7;&#x884C;. &#x537D;&#x4F7F;&#x8868;&#x683C;&#x4E2D;&#x524D;&#x9762;&#x7684;&#x6578;&#x64DA;&#x5C0E;&#x81F4;&#x4E86;&#x6E2C;&#x8A66;&#x7684;&#x5931;&#x6557;, &#x8868;&#x683C;&#x5F8C;&#x9762;&#x7684;&#x6E2C;&#x8A66;&#x6578;&#x64DA;&#x4F9D;&#x7136;&#x6703;&#x904B;&#x884C;&#x6E2C;&#x8A66;, &#x56E0;&#x6B64;&#x5728;&#x4E00;&#x500B;&#x6E2C;&#x8A66;&#x4E2D;&#x6211;&#x5011;&#x53EF;&#x80FD;&#x4E86;&#x89E3;&#x591A;&#x500B;&#x5931;&#x6557;&#x7684;&#x4FE1;&#x606F;.</p>
<p>&#x5982;&#x679C;&#x6211;&#x5011;&#x771E;&#x7684;&#x9700;&#x8981;&#x505C;&#x6B62;&#x6E2C;&#x8A66;, &#x6216;&#x8A31;&#x662F;&#x56E0;&#x7232;&#x521D;&#x59CB;&#x5316;&#x5931;&#x6557;&#x6216;&#x53EF;&#x80FD;&#x662F;&#x65E9;&#x5148;&#x7684;&#x932F;&#x8AA4;&#x5C0E;&#x81F4;&#x4E86;&#x5F8C;&#x7E8C;&#x932F;&#x8AA4;&#x7B49;&#x539F;&#x56E0;, &#x6211;&#x5011;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; t.Fatal &#x6216; t.Fatalf &#x505C;&#x6B62;&#x6E2C;&#x8A66;. &#x5B83;&#x5011;&#x5FC5;&#x9B1A;&#x5728;&#x548C;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x540C;&#x4E00;&#x500B; goroutine &#x5167;&#x8ABF;&#x7528;.</p>
<p>&#x6E2C;&#x8A66;&#x5931;&#x6557;&#x7684;&#x4FE1;&#x606F;&#x4E00;&#x822C;&#x7684;&#x5F62;&#x5F0F;&#x662F; &quot;f(x) = y, want z&quot;, f(x) &#x89E3;&#x91CB;&#x4E86;&#x5931;&#x6557;&#x7684;&#x64CD;&#x4F5C;&#x548C;&#x5C0D;&#x61C9;&#x7684;&#x8F38;&#x9F63;, y &#x662F;&#x5BE6;&#x969B;&#x7684;&#x904B;&#x884C;&#x7D50;&#x679C;, z &#x662F;&#x671F;&#x671B;&#x7684;&#x6B63;&#x78BA;&#x7684;&#x7D50;&#x679C;. &#x5C31;&#x50CF;&#x524D;&#x9762;&#x6AA2;&#x67FB;&#x8FF4;&#x6587;&#x5B57;&#x7B26;&#x4E32;&#x7684;&#x4F8B;&#x5B50;, &#x5BE6;&#x969B;&#x7684;&#x51FD;&#x6578;&#x7528;&#x65BC; f(x) &#x90E8;&#x5206;. &#x5982;&#x679C;&#x986F;&#x793A; x &#x662F;&#x8868;&#x683C;&#x9A45;&#x52D5;&#x578B;&#x6E2C;&#x8A66;&#x4E2D;&#x6BD4;&#x8F03;&#x91CD;&#x8981;&#x7684;&#x90E8;&#x5206;, &#x56E0;&#x7232;&#x540C;&#x4E00;&#x500B;&#x65B7;&#x8A00;&#x53EF;&#x80FD;&#x5C0D;&#x61C9;&#x4E0D;&#x540C;&#x7684;&#x8868;&#x683C;&#x9805;&#x57F7;&#x884C;&#x591A;&#x6B21;. &#x8981;&#x907F;&#x514D;&#x7121;&#x7528;&#x548C;&#x5197;&#x9918;&#x7684;&#x4FE1;&#x606F;. &#x5728;&#x6E2C;&#x8A66;&#x985E;&#x4F3C; IsPalindrome &#x8FD4;&#x8FF4;&#x5E03;&#x723E;&#x985E;&#x578B;&#x7684;&#x51FD;&#x6578;&#x6642;, &#x53EF;&#x4EE5;&#x5FFD;&#x7565;&#x4F75;&#x6C92;&#x6709;&#x984D;&#x5916;&#x4FE1;&#x606F;&#x7684; z &#x90E8;&#x5206;. &#x5982;&#x679C; x, y &#x6216; z &#x662F; y &#x7684;&#x9577;&#x5EA6;, &#x8F38;&#x9F63;&#x4E00;&#x500B;&#x76F8;&#x95DC;&#x90E8;&#x5206;&#x7684;&#x7C21;&#x660E;&#x7E3D;&#x7D50;&#x537D;&#x53EF;. &#x6E2C;&#x8A66;&#x7684;&#x4F5C;&#x8005;&#x61C9;&#x8A72;&#x8981;&#x52AA;&#x529B;&#x5E6B;&#x52A9;&#x7A0B;&#x5E8F;&#x54E1;&#x8A3A;&#x65B7;&#x5931;&#x6557;&#x7684;&#x6E2C;&#x8A66;.</p>
<p><strong>&#x7DF4;&#x7FD2; 11.1:</strong> &#x7232; 4.3&#x7BC0; &#x4E2D;&#x7684; charcount &#x7A0B;&#x5E8F;&#x7DE8;&#x5BEB;&#x6E2C;&#x8A66;.</p>
<p><strong>&#x7DF4;&#x7FD2; 11.2:</strong> &#x7232; (&#xA7;6.5)&#x7684; IntSet &#x7DE8;&#x5BEB;&#x4E00;&#x7D44;&#x6E2C;&#x8A66;, &#x7528;&#x65BC;&#x6AA2;&#x67FB;&#x6BCF;&#x7B87;&#x64CD;&#x4F5C;&#x5F8C;&#x7684;&#x884C;&#x7232;&#x548C;&#x57FA;&#x65BC;&#x5167;&#x7F6E; map &#x7684;&#x96C6;&#x95A4;&#x7B49;&#x50F9; , &#x5F8C;&#x9EAB; &#x7DF4;&#x7FD2;11.7 &#x5C07;&#x6703;&#x7528;&#x5230;.</p>
<p><strong>&#x7DF4;&#x7FD2; 11.2:</strong> &#x7232; (&#xA7;6.5)&#x7684; IntSet &#x7DE8;&#x5BEB;&#x4E00;&#x7D44;&#x6E2C;&#x8A66;, &#x7528;&#x65BC;&#x6AA2;&#x67FB;&#x6BCF;&#x500B;&#x64CD;&#x4F5C;&#x5F8C;&#x7684;&#x884C;&#x7232;&#x548C;&#x57FA;&#x65BC;&#x5167;&#x7F6E; map &#x7684;&#x96C6;&#x5408;&#x7B49;&#x50F9; , &#x5F8C;&#x9762; &#x7DF4;&#x7FD2;11.7 &#x5C07;&#x6703;&#x7528;&#x5230;.</p>
<h3 id="1121-&#x96A8;&#x6A5F;&#x6E2C;&#x8A66;">11.2.1. &#x96A8;&#x6A5F;&#x6E2C;&#x8A66;</h3>
<p>&#x9336;&#x683C;&#x9A45;&#x52D5;&#x7684;&#x6E2C;&#x8A66;&#x4FBF;&#x65BC;&#x69CB;&#x9020;&#x57FA;&#x65BC;&#x7CBE;&#x5FC3;&#x6311;&#x9078;&#x7684;&#x6E2C;&#x8A66;&#x6578;&#x64DA;&#x7684;&#x6E2C;&#x8A66;&#x7528;&#x4F8B;. &#x53E6;&#x4E00;&#x7A2E;&#x6E2C;&#x8A66;&#x601D;&#x8DEF;&#x662F;&#x96A8;&#x6A5F;&#x6E2C;&#x8A66;, &#x4E5F;&#x5C31;&#x662F;&#x901A;&#x904E;&#x69CB;&#x9020;&#x66F4;&#x5EE3;&#x6C4E;&#x7684;&#x96A8;&#x6A5F;&#x8F38;&#x5165;&#x4F86;&#x6E2C;&#x8A66;&#x63A2;&#x7D22;&#x51FD;&#x6578;&#x7684;&#x884C;&#x7232;.</p>
<p>&#x90A3;&#x9EBC;&#x5C0D;&#x65BC;&#x4E00;&#x7B87;&#x96A8;&#x6A5F;&#x7684;&#x8F38;&#x5165;, &#x6211;&#x5011;&#x5982;&#x4F55;&#x80FD;&#x77E5;&#x9053;&#x5E0C;&#x671B;&#x7684;&#x8F38;&#x9F63;&#x7D50;&#x679C;&#x5462;? &#x9019;&#x88E1;&#x6709;&#x5169;&#x7A2E;&#x7B56;&#x7565;. &#x7B2C;&#x4E00;&#x7B87;&#x662F;&#x7DE8;&#x5BEB;&#x53E6;&#x4E00;&#x7B87;&#x51FD;&#x6578;, &#x4F7F;&#x7528;&#x7C21;&#x55AE;&#x548C;&#x6E05;&#x6670;&#x7684;&#x7B97;&#x6CD5;, &#x96D6;&#x7136;&#x6548;&#x7387;&#x8F03;&#x4F4E;&#x4F46;&#x662F;&#x884C;&#x7232;&#x548C;&#x8981;&#x6E2C;&#x8A66;&#x7684;&#x51FD;&#x6578;&#x4E00;&#x7DFB;, &#x7136;&#x5F8C;&#x937C;&#x5C0D;&#x76F8;&#x8855;&#x7684;&#x96A8;&#x6A5F;&#x8F38;&#x5165;&#x6AA2;&#x67FB;&#x5169;&#x8005;&#x7684;&#x8F38;&#x9F63;&#x7D50;&#x679C;. &#x7B2C;&#x4E8C;&#x7A2E;&#x662F;&#x751F;&#x6210;&#x7684;&#x96A8;&#x6A5F;&#x8F38;&#x5165;&#x7684;&#x6578;&#x64DA;&#x9075;&#x5FAA;&#x7279;&#x5B9A;&#x7684;&#x6A21;&#x5F0F;, &#x9019;&#x6A23;&#x6211;&#x5011;&#x5C31;&#x53EF;&#x4EE5;&#x77E5;&#x9053;&#x671F;&#x671B;&#x7684;&#x8F38;&#x9F63;&#x7684;&#x6A21;&#x5F0F;.</p>
<p>&#x4E0B;&#x9EAB;&#x7684;&#x4F8B;&#x5B50;&#x4F7F;&#x7528;&#x7684;&#x662F;&#x7B2C;&#x4E8C;&#x7A2E;&#x65B9;&#x6CD5;: randomPalindrome &#x51FD;&#x6578;&#x7528;&#x65BC;&#x96A8;&#x6A5F;&#x751F;&#x6210;&#x8FF4;&#x6587;&#x5B57;&#x7B26;&#x4E32;.</p>
<p>&#x8868;&#x683C;&#x9A45;&#x52D5;&#x7684;&#x6E2C;&#x8A66;&#x4FBF;&#x65BC;&#x69CB;&#x9020;&#x57FA;&#x65BC;&#x7CBE;&#x5FC3;&#x6311;&#x9078;&#x7684;&#x6E2C;&#x8A66;&#x6578;&#x64DA;&#x7684;&#x6E2C;&#x8A66;&#x7528;&#x4F8B;. &#x53E6;&#x4E00;&#x7A2E;&#x6E2C;&#x8A66;&#x601D;&#x8DEF;&#x662F;&#x96A8;&#x6A5F;&#x6E2C;&#x8A66;, &#x4E5F;&#x5C31;&#x662F;&#x901A;&#x904E;&#x69CB;&#x9020;&#x66F4;&#x5EE3;&#x6CDB;&#x7684;&#x96A8;&#x6A5F;&#x8F38;&#x5165;&#x4F86;&#x6E2C;&#x8A66;&#x63A2;&#x7D22;&#x51FD;&#x6578;&#x7684;&#x884C;&#x7232;.</p>
<p>&#x90A3;&#x9EBD;&#x5C0D;&#x65BC;&#x4E00;&#x500B;&#x96A8;&#x6A5F;&#x7684;&#x8F38;&#x5165;, &#x6211;&#x5011;&#x5982;&#x4F55;&#x80FD;&#x77E5;&#x9053;&#x5E0C;&#x671B;&#x7684;&#x8F38;&#x9F63;&#x7D50;&#x679C;&#x5462;? &#x9019;&#x91CC;&#x6709;&#x5169;&#x7A2E;&#x7B56;&#x7565;. &#x7B2C;&#x4E00;&#x500B;&#x662F;&#x7DE8;&#x5BEB;&#x53E6;&#x4E00;&#x500B;&#x51FD;&#x6578;, &#x4F7F;&#x7528;&#x7C21;&#x55AE;&#x548C;&#x6E05;&#x6670;&#x7684;&#x7B97;&#x6CD5;, &#x96D6;&#x7136;&#x6548;&#x7387;&#x8F03;&#x4F4E;&#x4F46;&#x662F;&#x884C;&#x7232;&#x548C;&#x8981;&#x6E2C;&#x8A66;&#x7684;&#x51FD;&#x6578;&#x4E00;&#x81F4;, &#x7136;&#x5F8C;&#x91DD;&#x5C0D;&#x76F8;&#x540C;&#x7684;&#x96A8;&#x6A5F;&#x8F38;&#x5165;&#x6AA2;&#x67FB;&#x5169;&#x8005;&#x7684;&#x8F38;&#x9F63;&#x7D50;&#x679C;. &#x7B2C;&#x4E8C;&#x7A2E;&#x662F;&#x751F;&#x6210;&#x7684;&#x96A8;&#x6A5F;&#x8F38;&#x5165;&#x7684;&#x6578;&#x64DA;&#x9075;&#x5FAA;&#x7279;&#x5B9A;&#x7684;&#x6A21;&#x5F0F;, &#x9019;&#x6A23;&#x6211;&#x5011;&#x5C31;&#x53EF;&#x4EE5;&#x77E5;&#x9053;&#x671F;&#x671B;&#x7684;&#x8F38;&#x9F63;&#x7684;&#x6A21;&#x5F0F;.</p>
<p>&#x4E0B;&#x9762;&#x7684;&#x4F8B;&#x5B50;&#x4F7F;&#x7528;&#x7684;&#x662F;&#x7B2C;&#x4E8C;&#x7A2E;&#x65B9;&#x6CD5;: randomPalindrome &#x51FD;&#x6578;&#x7528;&#x65BC;&#x96A8;&#x6A5F;&#x751F;&#x6210;&#x8FF4;&#x6587;&#x5B57;&#x7B26;&#x4E32;.</p>
<pre><code class="lang-Go"><span class="hljs-keyword">import</span> <span class="hljs-string">&quot;math/rand&quot;</span>
<span class="hljs-comment">// randomPalindrome returns a palindrome whose length and contents</span>
@@ -2257,13 +2221,13 @@ ok gopl.io/ch11/word2 0.015s
}
}
</code></pre>
<p>&#x96D6;&#x7136;&#x96A8;&#x6A5F;&#x6E2C;&#x8A66;&#x6709;&#x4E0D;&#x78BA;&#x5B9A;&#x56E0;&#x7D20;, &#x4F46;&#x662F;&#x5B83;&#x4E5F;&#x662F;&#x81F3;&#x95DC;&#x91CD;&#x8981;&#x7684;, &#x6211;&#x5011;&#x53EF;&#x4EE5;&#x5F9E;&#x5931;&#x6557;&#x6E2C;&#x8A66;&#x7684;&#x65E5;&#x8A8C;&#x7A6B;&#x53D6;&#x8DB3;&#x5920;&#x7684;&#x4FE1;&#x606F;. &#x5728;&#x6211;&#x5011;&#x7684;&#x4F8B;&#x5B50;&#x4E2D;, &#x8F38;&#x5165; IsPalindrome &#x7684; p &#x53C3;&#x6578;&#x5C07;&#x544A;&#x8A34;&#x6211;&#x5011;&#x771E;&#x5BE6;&#x7684;&#x6578;&#x64DA;, &#x4F46;&#x662F;&#x5C0D;&#x65BC;&#x51FD;&#x6578;&#x5C07;&#x63A5;&#x53D7;&#x66F4;&#x5FA9;&#x96DC;&#x7684;&#x8F38;&#x5165;, &#x4E0D;&#x9700;&#x8981;&#x4FDD;&#x5B58;&#x6240;&#x6709;&#x7684;&#x8F38;&#x5165;, &#x96BB;&#x8981;&#x65E5;&#x8A8C;&#x4E2D;&#x7C21;&#x55AE;&#x5730;&#x8A18;&#x5F54;&#x96A8;&#x6A5F;&#x6578;&#x7A2E;&#x5B50;&#x537D;&#x53EF;(&#x50CF;&#x4E0A;&#x9EAB;&#x7684;&#x65B9;&#x5F0F;). &#x6709;&#x4E86;&#x9019;&#x4E9B;&#x96A8;&#x6A5F;&#x6578;&#x521D;&#x59CB;&#x5316;&#x7A2E;&#x5B50;, &#x6211;&#x5011;&#x53EF;&#x4EE5;&#x5F88;&#x5BB9;&#x6613;&#x8129;&#x6539;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x4EE5;&#x91CD;&#x73FE;&#x5931;&#x6557;&#x7684;&#x96A8;&#x6A5F;&#x6E2C;&#x8A66;.</p>
<p>&#x901A;&#x904E;&#x4F7F;&#x7528;&#x5679;&#x524D;&#x6642;&#x9593;&#x4F5C;&#x7232;&#x96A8;&#x6A5F;&#x7A2E;&#x5B50;, &#x5728;&#x6574;&#x7B87;&#x904E;&#x7A0B;&#x4E2D;&#x7684;&#x6BCF;&#x6B21;&#x904B;&#x884C;&#x6E2C;&#x8A66;&#x547D;&#x4EE4;&#x6642;&#x90FD;&#x5C07;&#x63A2;&#x7D22;&#x65B0;&#x7684;&#x96A8;&#x6A5F;&#x6578;&#x64DA;. &#x5982;&#x679C;&#x4F60;&#x4F7F;&#x7528;&#x7684;&#x662F;&#x5B9A;&#x671F;&#x904B;&#x884C;&#x7684;&#x81EA;&#x52D5;&#x5316;&#x6E2C;&#x8A66;&#x96C6;&#x6210;&#x7E6B;&#x7D71;, &#x96A8;&#x6A5F;&#x6E2C;&#x8A66;&#x5C07;&#x7279;&#x5225;&#x6709;&#x50F9;&#x503C;.</p>
<p>&#x96D6;&#x7136;&#x96A8;&#x6A5F;&#x6E2C;&#x8A66;&#x6709;&#x4E0D;&#x78BA;&#x5B9A;&#x56E0;&#x7D20;, &#x4F46;&#x662F;&#x5B83;&#x4E5F;&#x662F;&#x81F3;&#x95DC;&#x91CD;&#x8981;&#x7684;, &#x6211;&#x5011;&#x53EF;&#x4EE5;&#x5F9E;&#x5931;&#x6557;&#x6E2C;&#x8A66;&#x7684;&#x65E5;&#x8A8C;&#x7A6B;&#x53D6;&#x8DB3;&#x5920;&#x7684;&#x4FE1;&#x606F;. &#x5728;&#x6211;&#x5011;&#x7684;&#x4F8B;&#x5B50;&#x4E2D;, &#x8F38;&#x5165; IsPalindrome &#x7684; p &#x53C3;&#x6578;&#x5C07;&#x544A;&#x8A34;&#x6211;&#x5011;&#x771E;&#x5BE6;&#x7684;&#x6578;&#x64DA;, &#x4F46;&#x662F;&#x5C0D;&#x65BC;&#x51FD;&#x6578;&#x5C07;&#x63A5;&#x53D7;&#x66F4;&#x8907;&#x96DC;&#x7684;&#x8F38;&#x5165;, &#x4E0D;&#x9700;&#x8981;&#x4FDD;&#x5B58;&#x6240;&#x6709;&#x7684;&#x8F38;&#x5165;, &#x96BB;&#x8981;&#x65E5;&#x8A8C;&#x4E2D;&#x7C21;&#x55AE;&#x5730;&#x8A18;&#x9332;&#x96A8;&#x6A5F;&#x6578;&#x7A2E;&#x5B50;&#x537D;&#x53EF;(&#x50CF;&#x4E0A;&#x9762;&#x7684;&#x65B9;&#x5F0F;). &#x6709;&#x4E86;&#x9019;&#x4E9B;&#x96A8;&#x6A5F;&#x6578;&#x521D;&#x59CB;&#x5316;&#x7A2E;&#x5B50;, &#x6211;&#x5011;&#x53EF;&#x4EE5;&#x5F88;&#x5BB9;&#x6613;&#x8129;&#x6539;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x4EE5;&#x91CD;&#x73FE;&#x5931;&#x6557;&#x7684;&#x96A8;&#x6A5F;&#x6E2C;&#x8A66;.</p>
<p>&#x901A;&#x904E;&#x4F7F;&#x7528;&#x7576;&#x524D;&#x6642;&#x9593;&#x4F5C;&#x7232;&#x96A8;&#x6A5F;&#x7A2E;&#x5B50;, &#x5728;&#x6574;&#x500B;&#x904E;&#x7A0B;&#x4E2D;&#x7684;&#x6BCF;&#x6B21;&#x904B;&#x884C;&#x6E2C;&#x8A66;&#x547D;&#x4EE4;&#x6642;&#x90FD;&#x5C07;&#x63A2;&#x7D22;&#x65B0;&#x7684;&#x96A8;&#x6A5F;&#x6578;&#x64DA;. &#x5982;&#x679C;&#x4F60;&#x4F7F;&#x7528;&#x7684;&#x662F;&#x5B9A;&#x671F;&#x904B;&#x884C;&#x7684;&#x81EA;&#x52D5;&#x5316;&#x6E2C;&#x8A66;&#x96C6;&#x6210;&#x7E6B;&#x7D71;, &#x96A8;&#x6A5F;&#x6E2C;&#x8A66;&#x5C07;&#x7279;&#x522B;&#x6709;&#x50F9;&#x503C;.</p>
<p><strong>&#x7DF4;&#x7FD2; 11.3:</strong> TestRandomPalindromes &#x96BB;&#x6E2C;&#x8A66;&#x4E86;&#x8FF4;&#x6587;&#x5B57;&#x7B26;&#x4E32;. &#x7DE8;&#x5BEB;&#x65B0;&#x7684;&#x96A8;&#x6A5F;&#x6E2C;&#x8A66;&#x751F;&#x6210;&#x5668;, &#x7528;&#x65BC;&#x6E2C;&#x8A66;&#x96A8;&#x6A5F;&#x751F;&#x6210;&#x7684;&#x975E;&#x8FF4;&#x6587;&#x5B57;&#x7B26;&#x4E32;.</p>
<p><strong>&#x7DF4;&#x7FD2; 11.4:</strong> &#x8129;&#x6539; randomPalindrome &#x51FD;&#x6578;, &#x4EE5;&#x63A2;&#x7D22; IsPalindrome &#x5C0D;&#x6A19;&#x9EDE;&#x548C;&#x7A7A;&#x683C;&#x7684;&#x8655;&#x7406;.</p>
<h3 id="1122-&#x6E2C;&#x8A66;&#x4E00;&#x500B;&#x547D;&#x4EE4;">11.2.2. &#x6E2C;&#x8A66;&#x4E00;&#x500B;&#x547D;&#x4EE4;</h3>
<p>&#x5C0D;&#x65BC;&#x6E2C;&#x8A66;&#x5305; <code>go test</code> &#x662F;&#x4E00;&#x500B;&#x7684;&#x6709;&#x7528;&#x7684;&#x5DE5;&#x5177;, &#x4F46;&#x662F;&#x7A0D;&#x52A0;&#x52AA;&#x529B;&#x6211;&#x5011;&#x4E5F;&#x53EF;&#x4EE5;&#x7528;&#x5B83;&#x4F86;&#x6E2C;&#x8A66;&#x53EF;&#x57F7;&#x884C;&#x7A0B;&#x5E8F;. &#x5982;&#x679C;&#x4E00;&#x500B;&#x5305;&#x7684;&#x540D;&#x5B57;&#x662F; main, &#x90A3;&#x9EBD;&#x5728;&#x69CB;&#x5EFA;&#x6642;&#x6703;&#x751F;&#x6210;&#x4E00;&#x500B;&#x53EF;&#x57F7;&#x884C;&#x7A0B;&#x5E8F;, &#x4E0D;&#x904E; main &#x5305;&#x53EF;&#x4EE5;&#x4F5C;&#x70BA;&#x4E00;&#x500B;&#x5305;&#x88AB;&#x6E2C;&#x8A66;&#x5668;&#x4EE3;&#x78BC;&#x5C0E;&#x5165;.</p>
<p>&#x8B93;&#x6211;&#x5011;&#x70BA; 2.3.2&#x7BC0; &#x7684; echo &#x7A0B;&#x5E8F;&#x7DE8;&#x5BEB;&#x4E00;&#x500B;&#x6E2C;&#x8A66;. &#x6211;&#x5011;&#x5148;&#x5C07;&#x7A0B;&#x5E8F;&#x62C6;&#x5206;&#x70BA;&#x5169;&#x500B;&#x51FD;&#x6578;: echo &#x51FD;&#x6578;&#x5B8C;&#x6210;&#x771E;&#x6B63;&#x7684;&#x5DE5;&#x4F5C;, main &#x51FD;&#x6578;&#x7528;&#x65BC;&#x8655;&#x7406;&#x547D;&#x4EE4;&#x884C;&#x8F38;&#x5165;&#x53C3;&#x6578;&#x548C;echo&#x53EF;&#x80FD;&#x8FD4;&#x8FF4;&#x7684;&#x932F;&#x8AA4;.</p>
<p>&#x5C0D;&#x65BC;&#x6E2C;&#x8A66;&#x5305; <code>go test</code> &#x662F;&#x4E00;&#x500B;&#x7684;&#x6709;&#x7528;&#x7684;&#x5DE5;&#x5177;, &#x4F46;&#x662F;&#x7A0D;&#x52A0;&#x52AA;&#x529B;&#x6211;&#x5011;&#x4E5F;&#x53EF;&#x4EE5;&#x7528;&#x5B83;&#x4F86;&#x6E2C;&#x8A66;&#x53EF;&#x57F7;&#x884C;&#x7A0B;&#x5E8F;. &#x5982;&#x679C;&#x4E00;&#x500B;&#x5305;&#x7684;&#x540D;&#x5B57;&#x662F; main, &#x90A3;&#x9EBD;&#x5728;&#x69CB;&#x5EFA;&#x6642;&#x6703;&#x751F;&#x6210;&#x4E00;&#x500B;&#x53EF;&#x57F7;&#x884C;&#x7A0B;&#x5E8F;, &#x4E0D;&#x904E; main &#x5305;&#x53EF;&#x4EE5;&#x4F5C;&#x7232;&#x4E00;&#x500B;&#x5305;&#x88AB;&#x6E2C;&#x8A66;&#x5668;&#x4EE3;&#x78BC;&#x5C0E;&#x5165;.</p>
<p>&#x8B93;&#x6211;&#x5011;&#x7232; 2.3.2&#x7BC0; &#x7684; echo &#x7A0B;&#x5E8F;&#x7DE8;&#x5BEB;&#x4E00;&#x500B;&#x6E2C;&#x8A66;. &#x6211;&#x5011;&#x5148;&#x5C07;&#x7A0B;&#x5E8F;&#x62C6;&#x5206;&#x7232;&#x5169;&#x500B;&#x51FD;&#x6578;: echo &#x51FD;&#x6578;&#x5B8C;&#x6210;&#x771E;&#x6B63;&#x7684;&#x5DE5;&#x4F5C;, main &#x51FD;&#x6578;&#x7528;&#x65BC;&#x8655;&#x7406;&#x547D;&#x4EE4;&#x884C;&#x8F38;&#x5165;&#x53C3;&#x6578;&#x548C;echo&#x53EF;&#x80FD;&#x8FD4;&#x8FF4;&#x7684;&#x932F;&#x8AA4;.</p>
<pre><code class="lang-Go">gopl.io/ch11/echo
<span class="hljs-comment">// Echo prints its command-line arguments.</span>
<span class="hljs-keyword">package</span> main
@@ -2299,7 +2263,7 @@ ok gopl.io/ch11/word2 0.015s
<span class="hljs-keyword">return</span> <span class="hljs-constant">nil</span>
}
</code></pre>
<p>&#x5728;&#x6E2C;&#x8A66;&#x4E2D;&#x55CE;&#x6211;&#x5011;&#x53EF;&#x4EE5;&#x7528;&#x5404;&#x7A2E;&#x53C3;&#x6578;&#x548C;&#x6A19;&#x6A19;&#x8A8C;&#x8ABF;&#x7528; echo &#x51FD;&#x6578;, &#x7136;&#x5F8C;&#x6AA2;&#x6E2C;&#x5B83;&#x7684;&#x8F38;&#x9F63;&#x662F;&#x5426;&#x6B63;&#x78BA;, &#x6211;&#x5011;&#x901A;&#x904E;&#x589E;&#x52A0;&#x53C3;&#x6578;&#x4F86;&#x6E1B;&#x5C11; echo &#x51FD;&#x6578;&#x5C0D;&#x5168;&#x4FB7;&#x8B8A;&#x91CF;&#x7684;&#x4F9D;&#x8CF4;. &#x6211;&#x5011;&#x9084;&#x589E;&#x52A0;&#x4E86;&#x4E00;&#x500B;&#x5168;&#x4FB7;&#x540D;&#x70BA; out &#x7684;&#x8B8A;&#x91CF;&#x4F86;&#x66FF;&#x4EE3;&#x76F4;&#x63A5;&#x4F7F;&#x7528; os.Stdout, &#x9019;&#x6A23;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x53EF;&#x4EE5;&#x6839;&#x64DA;&#x9700;&#x8981;&#x5C07; out &#x8129;&#x6539;&#x70BA;&#x4E0D;&#x8855;&#x7684;&#x5C0D;&#x8C61;&#x4EE5;&#x4FBF;&#x65BC;&#x6AA2;&#x67FB;. &#x4E0B;&#x9EAA;&#x5C31;&#x662F; echo_test.go &#x6587;&#x4EF6;&#x4E2D;&#x7684;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;:</p>
<p>&#x5728;&#x6E2C;&#x8A66;&#x4E2D;&#x55CE;&#x6211;&#x5011;&#x53EF;&#x4EE5;&#x7528;&#x5404;&#x7A2E;&#x53C3;&#x6578;&#x548C;&#x6A19;&#x6A19;&#x8A8C;&#x8ABF;&#x7528; echo &#x51FD;&#x6578;, &#x7136;&#x5F8C;&#x6AA2;&#x6E2C;&#x5B83;&#x7684;&#x8F38;&#x9F63;&#x662F;&#x5426;&#x6B63;&#x78BA;, &#x6211;&#x5011;&#x901A;&#x904E;&#x589E;&#x52A0;&#x53C3;&#x6578;&#x4F86;&#x6E1B;&#x5C11; echo &#x51FD;&#x6578;&#x5C0D;&#x5168;&#x5C40;&#x8B8A;&#x91CF;&#x7684;&#x4F9D;&#x8CF4;. &#x6211;&#x5011;&#x9084;&#x589E;&#x52A0;&#x4E86;&#x4E00;&#x500B;&#x5168;&#x5C40;&#x540D;&#x7232; out &#x7684;&#x8B8A;&#x91CF;&#x4F86;&#x66FF;&#x4EE3;&#x76F4;&#x63A5;&#x4F7F;&#x7528; os.Stdout, &#x9019;&#x6A23;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x53EF;&#x4EE5;&#x6839;&#x64DA;&#x9700;&#x8981;&#x5C07; out &#x8129;&#x6539;&#x7232;&#x4E0D;&#x540C;&#x7684;&#x5C0D;&#x8C61;&#x4EE5;&#x4FBF;&#x65BC;&#x6AA2;&#x67FB;. &#x4E0B;&#x9762;&#x5C31;&#x662F; echo_test.go &#x6587;&#x4EF6;&#x4E2D;&#x7684;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;:</p>
<pre><code class="lang-Go"><span class="hljs-keyword">package</span> main
<span class="hljs-keyword">import</span> (
@@ -2337,8 +2301,8 @@ ok gopl.io/ch11/word2 0.015s
}
}
</code></pre>
<p>&#x8981;&#x8A3B;&#x610F;&#x7684;&#x662F;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x548C;&#x7522;&#x54C1;&#x4EE3;&#x78BC;&#x5728;&#x8855;&#x4E00;&#x500B;&#x5305;. &#x96D6;&#x7136;&#x662F;main&#x5305;, &#x4E5F;&#x6709;&#x5C0D;&#x61C9;&#x7684; main &#x5165;&#x53E3;&#x51FD;&#x6578;, &#x4F46;&#x662F;&#x5728;&#x6E2C;&#x8A66;&#x7684;&#x6642;&#x5019; main &#x5305;&#x96BB;&#x662F; TestEcho &#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x5C0E;&#x5165;&#x7684;&#x4E00;&#x500B;&#x666E;&#x901A;&#x5305;, &#x88E1;&#x9EAA; main &#x51FD;&#x6578;&#x4E26;&#x6C92;&#x6709;&#x88AB;&#x5C0E;&#x9F63;&#x662F;&#x88AB;&#x5FFD;&#x7565;&#x7684;.</p>
<p>&#x901A;&#x904E;&#x5C07;&#x6E2C;&#x8A66;&#x653E;&#x5230;&#x9336;&#x683C;&#x4E2D;, &#x6211;&#x5011;&#x5F88;&#x5BB9;&#x6613;&#x6DFB;&#x52A0;&#x65B0;&#x7684;&#x6E2C;&#x8A66;&#x7528;&#x4F8B;. &#x8B93;&#x6211;&#x901A;&#x904E;&#x589E;&#x52A0;&#x4E0B;&#x9EAA;&#x7684;&#x6E2C;&#x8A66;&#x7528;&#x4F8B;&#x4F86;&#x770B;&#x770B;&#x5931;&#x6557;&#x7684;&#x60C5;&#x6CC1;&#x662F;&#x600E;&#x9EBD;&#x6A23;&#x7684;:</p>
<p>&#x8981;&#x8A3B;&#x610F;&#x7684;&#x662F;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x548C;&#x7523;&#x54C1;&#x4EE3;&#x78BC;&#x5728;&#x540C;&#x4E00;&#x500B;&#x5305;. &#x96D6;&#x7136;&#x662F;main&#x5305;, &#x4E5F;&#x6709;&#x5C0D;&#x61C9;&#x7684; main &#x5165;&#x53E3;&#x51FD;&#x6578;, &#x4F46;&#x662F;&#x5728;&#x6E2C;&#x8A66;&#x7684;&#x6642;&#x5019; main &#x5305;&#x96BB;&#x662F; TestEcho &#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x5C0E;&#x5165;&#x7684;&#x4E00;&#x500B;&#x666E;&#x901A;&#x5305;, &#x91CC;&#x9762; main &#x51FD;&#x6578;&#x4F75;&#x6C92;&#x6709;&#x88AB;&#x5C0E;&#x9F63;&#x662F;&#x88AB;&#x5FFD;&#x7565;&#x7684;.</p>
<p>&#x901A;&#x904E;&#x5C07;&#x6E2C;&#x8A66;&#x653E;&#x5230;&#x8868;&#x683C;&#x4E2D;, &#x6211;&#x5011;&#x5F88;&#x5BB9;&#x6613;&#x6DFB;&#x52A0;&#x65B0;&#x7684;&#x6E2C;&#x8A66;&#x7528;&#x4F8B;. &#x8B93;&#x6211;&#x901A;&#x904E;&#x589E;&#x52A0;&#x4E0B;&#x9762;&#x7684;&#x6E2C;&#x8A66;&#x7528;&#x4F8B;&#x4F86;&#x770B;&#x770B;&#x5931;&#x6557;&#x7684;&#x60C5;&#x6CC1;&#x662F;&#x600E;&#x9EBD;&#x6A23;&#x7684;:</p>
<pre><code class="lang-Go">{<span class="hljs-constant">true</span>, <span class="hljs-string">&quot;,&quot;</span>, []<span class="hljs-typename">string</span>{<span class="hljs-string">&quot;a&quot;</span>, <span class="hljs-string">&quot;b&quot;</span>, <span class="hljs-string">&quot;c&quot;</span>}, <span class="hljs-string">&quot;a b c\n&quot;</span>}, <span class="hljs-comment">// <span class="hljs-doctag">NOTE:</span> wrong expectation!</span>
</code></pre>
<p><code>go test</code> &#x8F38;&#x9F63;&#x5982;&#x4E0B;:</p>
@@ -2347,14 +2311,14 @@ ok gopl.io/ch11/word2 0.015s
echo_test.go:31: echo(true, &quot;,&quot;, [&quot;a&quot; &quot;b&quot; &quot;c&quot;]) = &quot;a,b,c&quot;, want &quot;a b c\n&quot;
FAIL
FAIL gopl.io/ch11/echo 0.006s
</code></pre><p>&#x932F;&#x8AA4;&#x4FE1;&#x606F;&#x63CF;&#x8FF0;&#x4E86;&#x5617;&#x8A66;&#x7684;&#x64CD;&#x4F5C;(&#x4F7F;&#x7528;Go&#x985E;&#x4F3C;&#x8A9E;&#x6CD5;), &#x5BE6;&#x969B;&#x7684;&#x884C;&#x70BA;, &#x548C;&#x671F;&#x671B;&#x7684;&#x884C;&#x70BA;. &#x901A;&#x904E;&#x9019;&#x6A23;&#x7684;&#x932F;&#x8AA4;&#x4FE1;&#x606F;, &#x4F60;&#x53EF;&#x4EE5;&#x5728;&#x6AA2;&#x8996;&#x4EE3;&#x78BC;&#x4E4B;&#x524D;&#x5C31;&#x5F88;&#x5BB9;&#x6613;&#x5B9A;&#x4F4D;&#x932F;&#x8AA4;&#x7684;&#x539F;&#x56E0;.</p>
<p>&#x8981;&#x8A3B;&#x610F;&#x7684;&#x662F;&#x5728;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x4E2D;&#x4E26;&#x6C92;&#x6709;&#x8ABF;&#x7528; log.Fatal &#x6216; os.Exit, &#x56E0;&#x70BA;&#x8ABF;&#x7528;&#x9019;&#x985E;&#x51FD;&#x6578;&#x6703;&#x5C0E;&#x7DFB;&#x7A0B;&#x5E8F;&#x63D0;&#x524D;&#x9000;&#x9F63;; &#x8ABF;&#x7528;&#x9019;&#x4E9B;&#x51FD;&#x6578;&#x7684;&#x7279;&#x6B0A;&#x61C9;&#x8A72;&#x653E;&#x5728; main &#x51FD;&#x6578;&#x4E2D;. &#x5982;&#x679C;&#x771E;&#x7684;&#x6709;&#x4EE5;&#x5916;&#x7684;&#x4E8B;&#x60C5;&#x5C0E;&#x7DFB;&#x51FD;&#x6578;&#x767C;&#x9001; panic, &#x6E2C;&#x8A66;&#x9A45;&#x52D5;&#x61C9;&#x8A72;&#x5617;&#x8A66; recover, &#x7136;&#x5F8C;&#x5C07;&#x5679;&#x524D;&#x6E2C;&#x8A66;&#x5679;&#x4F5C;&#x5931;&#x6557;&#x8655;&#x7406;. &#x5982;&#x679C;&#x662F;&#x53EF;&#x9810;&#x671F;&#x7684;&#x932F;&#x8AA4;, &#x4F8B;&#x5982;&#x975E;&#x6CD5;&#x7684;&#x7528;&#x6236;&#x8F38;&#x5165;, &#x627E;&#x4E0D;&#x5230;&#x6587;&#x4EF6;, &#x6216;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x4E0D;&#x5679;&#x7B49;&#x61C9;&#x8A72;&#x901A;&#x904E;&#x8FD4;&#x8FF4;&#x4E00;&#x500B;&#x975E;&#x7A7A;&#x7684; error &#x7684;&#x65B9;&#x5F0F;&#x8655;&#x7406;. &#x5016;&#x904B;&#x7684;&#x662F;(&#x4E0A;&#x9EAA;&#x7684;&#x610F;&#x5916;&#x96BB;&#x662F;&#x4E00;&#x500B;&#x63D2;&#x9EAF;), &#x6211;&#x5011;&#x7684; echo &#x793A;&#x4F8B;&#x662F;&#x6BD4;&#x8F03;&#x7C21;&#x55AE;&#x7684;&#x4E5F;&#x6C92;&#x6709;&#x9700;&#x8981;&#x8FD4;&#x8FF4;&#x975E;&#x7A7A;error&#x7684;&#x60C5;&#x6CC1;.</p>
</code></pre><p>&#x932F;&#x8AA4;&#x4FE1;&#x606F;&#x63CF;&#x8FF0;&#x4E86;&#x5690;&#x8A66;&#x7684;&#x64CD;&#x4F5C;(&#x4F7F;&#x7528;Go&#x985E;&#x4F3C;&#x8A9E;&#x6CD5;), &#x5BE6;&#x969B;&#x7684;&#x884C;&#x7232;, &#x548C;&#x671F;&#x671B;&#x7684;&#x884C;&#x7232;. &#x901A;&#x904E;&#x9019;&#x6A23;&#x7684;&#x932F;&#x8AA4;&#x4FE1;&#x606F;, &#x4F60;&#x53EF;&#x4EE5;&#x5728;&#x6AA2;&#x8996;&#x4EE3;&#x78BC;&#x4E4B;&#x524D;&#x5C31;&#x5F88;&#x5BB9;&#x6613;&#x5B9A;&#x4F4D;&#x932F;&#x8AA4;&#x7684;&#x539F;&#x56E0;.</p>
<p>&#x8981;&#x8A3B;&#x610F;&#x7684;&#x662F;&#x5728;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x4E2D;&#x4F75;&#x6C92;&#x6709;&#x8ABF;&#x7528; log.Fatal &#x6216; os.Exit, &#x56E0;&#x7232;&#x8ABF;&#x7528;&#x9019;&#x985E;&#x51FD;&#x6578;&#x6703;&#x5C0E;&#x81F4;&#x7A0B;&#x5E8F;&#x63D0;&#x524D;&#x9000;&#x9F63;; &#x8ABF;&#x7528;&#x9019;&#x4E9B;&#x51FD;&#x6578;&#x7684;&#x7279;&#x6B0A;&#x61C9;&#x8A72;&#x653E;&#x5728; main &#x51FD;&#x6578;&#x4E2D;. &#x5982;&#x679C;&#x771E;&#x7684;&#x6709;&#x4EE5;&#x5916;&#x7684;&#x4E8B;&#x60C5;&#x5C0E;&#x81F4;&#x51FD;&#x6578;&#x767C;&#x9001; panic, &#x6E2C;&#x8A66;&#x9A45;&#x52D5;&#x61C9;&#x8A72;&#x5690;&#x8A66; recover, &#x7136;&#x5F8C;&#x5C07;&#x7576;&#x524D;&#x6E2C;&#x8A66;&#x7576;&#x4F5C;&#x5931;&#x6557;&#x8655;&#x7406;. &#x5982;&#x679C;&#x662F;&#x53EF;&#x9810;&#x671F;&#x7684;&#x932F;&#x8AA4;, &#x4F8B;&#x5982;&#x975E;&#x6CD5;&#x7684;&#x7528;&#x6236;&#x8F38;&#x5165;, &#x627E;&#x4E0D;&#x5230;&#x6587;&#x4EF6;, &#x6216;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x4E0D;&#x7576;&#x7B49;&#x61C9;&#x8A72;&#x901A;&#x904E;&#x8FD4;&#x8FF4;&#x4E00;&#x500B;&#x975E;&#x7A7A;&#x7684; error &#x7684;&#x65B9;&#x5F0F;&#x8655;&#x7406;. &#x5E78;&#x904B;&#x7684;&#x662F;(&#x4E0A;&#x9762;&#x7684;&#x610F;&#x5916;&#x96BB;&#x662F;&#x4E00;&#x500B;&#x63D2;&#x9EB4;), &#x6211;&#x5011;&#x7684; echo &#x793A;&#x4F8B;&#x662F;&#x6BD4;&#x8F03;&#x7C21;&#x55AE;&#x7684;&#x4E5F;&#x6C92;&#x6709;&#x9700;&#x8981;&#x8FD4;&#x8FF4;&#x975E;&#x7A7A;error&#x7684;&#x60C5;&#x6CC1;.</p>
<h3 id="1123-&#x767D;&#x76D2;&#x6E2C;&#x8A66;">11.2.3. &#x767D;&#x76D2;&#x6E2C;&#x8A66;</h3>
<p>&#x4E00;&#x500B;&#x6E2C;&#x8A66;&#x5206;&#x985E;&#x7684;&#x65B9;&#x6CD5;&#x662F;&#x57FA;&#x65BC;&#x6E2C;&#x8A66;&#x8005;&#x662F;&#x5426;&#x9700;&#x8981;&#x4E86;&#x89E3;&#x88AB;&#x6E2C;&#x8A66;&#x5C0D;&#x8C61;&#x7684;&#x5167;&#x90E8;&#x5DE5;&#x4F5C;&#x539F;&#x7406;. &#x9ED1;&#x76D2;&#x6E2C;&#x8A66;&#x96BB;&#x9700;&#x8981;&#x6E2C;&#x8A66;&#x5305;&#x516C;&#x958B;&#x7684;&#x6587;&#x6A94;&#x548C;API&#x884C;&#x70BA;, &#x5167;&#x90E8;&#x5BE6;&#x73FE;&#x5C0D;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x662F;&#x900F;&#x660E;&#x7684;. &#x76F8;&#x53CD;, &#x767D;&#x76D2;&#x6E2C;&#x8A66;&#x6709;&#x8A2A;&#x554F;&#x5305;&#x5167;&#x90E8;&#x51FD;&#x6578;&#x548C;&#x6578;&#x64DA;&#x7D50;&#x69CB;&#x7684;&#x6B0A;&#x9650;, &#x56E0;&#x6B64;&#x53EF;&#x4EE5;&#x505A;&#x5230;&#x4E00;&#x4E0B;&#x666E;&#x901A;&#x5BA2;&#x6236;&#x7AEF;&#x7121;&#x6CD5;&#x5BE6;&#x73FE;&#x7684;&#x6E2C;&#x8A66;. &#x4F8B;&#x5982;, &#x4E00;&#x500B;&#x98FD;&#x548C;&#x6E2C;&#x8A66;&#x53EF;&#x4EE5;&#x5728;&#x6BCF;&#x500B;&#x64CD;&#x4F5C;&#x4E4B;&#x5F8C;&#x6AA2;&#x6E2C;&#x4E0D;&#x8B8A;&#x91CF;&#x7684;&#x6578;&#x64DA;&#x985E;&#x578B;. (&#x767D;&#x76D2;&#x6E2C;&#x8A66;&#x96BB;&#x662F;&#x4E00;&#x500B;&#x50B3;&#x7D71;&#x7684;&#x540D;&#x7A31;, &#x5176;&#x5BE6;&#x7A31;&#x70BA; clear box &#x6703;&#x66F4;&#x6E96;&#x78BA;.)</p>
<p>&#x4E00;&#x500B;&#x6E2C;&#x8A66;&#x5206;&#x985E;&#x7684;&#x65B9;&#x6CD5;&#x662F;&#x57FA;&#x65BC;&#x6E2C;&#x8A66;&#x8005;&#x662F;&#x5426;&#x9700;&#x8981;&#x4E86;&#x89E3;&#x88AB;&#x6E2C;&#x8A66;&#x5C0D;&#x8C61;&#x7684;&#x5167;&#x90E8;&#x5DE5;&#x4F5C;&#x539F;&#x7406;. &#x9ED1;&#x76D2;&#x6E2C;&#x8A66;&#x96BB;&#x9700;&#x8981;&#x6E2C;&#x8A66;&#x5305;&#x516C;&#x958B;&#x7684;&#x6587;&#x6A94;&#x548C;API&#x884C;&#x7232;, &#x5167;&#x90E8;&#x5BE6;&#x73FE;&#x5C0D;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x662F;&#x900F;&#x660E;&#x7684;. &#x76F8;&#x53CD;, &#x767D;&#x76D2;&#x6E2C;&#x8A66;&#x6709;&#x8A2A;&#x554F;&#x5305;&#x5167;&#x90E8;&#x51FD;&#x6578;&#x548C;&#x6578;&#x64DA;&#x7D50;&#x69CB;&#x7684;&#x6B0A;&#x9650;, &#x56E0;&#x6B64;&#x53EF;&#x4EE5;&#x505A;&#x5230;&#x4E00;&#x4E0B;&#x666E;&#x901A;&#x5BA2;&#x6236;&#x7AEF;&#x7121;&#x6CD5;&#x5BE6;&#x73FE;&#x7684;&#x6E2C;&#x8A66;. &#x4F8B;&#x5982;, &#x4E00;&#x500B;&#x98FD;&#x548C;&#x6E2C;&#x8A66;&#x53EF;&#x4EE5;&#x5728;&#x6BCF;&#x500B;&#x64CD;&#x4F5C;&#x4E4B;&#x5F8C;&#x6AA2;&#x6E2C;&#x4E0D;&#x8B8A;&#x91CF;&#x7684;&#x6578;&#x64DA;&#x985E;&#x578B;. (&#x767D;&#x76D2;&#x6E2C;&#x8A66;&#x96BB;&#x662F;&#x4E00;&#x500B;&#x50B3;&#x7D71;&#x7684;&#x540D;&#x7A31;, &#x5176;&#x5BE6;&#x7A31;&#x7232; clear box &#x6703;&#x66F4;&#x6E96;&#x78BA;.)</p>
<p>&#x9ED1;&#x76D2;&#x548C;&#x767D;&#x76D2;&#x9019;&#x5169;&#x7A2E;&#x6E2C;&#x8A66;&#x65B9;&#x6CD5;&#x662F;&#x4E92;&#x88DC;&#x7684;. &#x9ED1;&#x76D2;&#x6E2C;&#x8A66;&#x4E00;&#x822C;&#x66F4;&#x5065;&#x58EF;, &#x96A8;&#x7740;&#x8EDF;&#x4EF6;&#x5BE6;&#x73FE;&#x7684;&#x5B8C;&#x5584;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x5F88;&#x5C11;&#x9700;&#x8981;&#x66F4;&#x65B0;. &#x5B83;&#x5011;&#x53EF;&#x4EE5;&#x5E6B;&#x52A9;&#x6E2C;&#x8A66;&#x8005;&#x4E86;&#x89E3;&#x771E;&#x662F;&#x5BA2;&#x6236;&#x7684;&#x9700;&#x6C42;, &#x53EF;&#x4EE5;&#x5E6B;&#x52A9;&#x767C;&#x73FE;API&#x8A2D;&#x8A08;&#x7684;&#x4E00;&#x4E9B;&#x4E0D;&#x8DB3;&#x4E4B;&#x8655;. &#x76F8;&#x53CD;, &#x767D;&#x76D2;&#x6E2C;&#x8A66;&#x5247;&#x53EF;&#x4EE5;&#x5C0D;&#x5167;&#x90E8;&#x4E00;&#x4E9B;&#x68D8;&#x624B;&#x7684;&#x5BE6;&#x73FE;&#x63D0;&#x4F9B;&#x66F4;&#x591A;&#x7684;&#x6E2C;&#x8A66;&#x8986;&#x84CB;.</p>
<p>&#x6211;&#x5011;&#x5DF2;&#x7D93;&#x770B;&#x5230;&#x5169;&#x7A2E;&#x6E2C;&#x8A66;&#x7684;&#x4F8B;&#x5B50;. TestIsPalindrome &#x6E2C;&#x8A66;&#x50C5;&#x50C5;&#x4F7F;&#x7528;&#x5C0E;&#x9F63;&#x7684; IsPalindrome &#x51FD;&#x6578;, &#x56E0;&#x6B64;&#x5B83;&#x662F;&#x4E00;&#x500B;&#x9ED1;&#x76D2;&#x6E2C;&#x8A66;. TestEcho &#x6E2C;&#x8A66;&#x5247;&#x8ABF;&#x7528;&#x4E86;&#x5167;&#x90E8;&#x7684; echo &#x51FD;&#x6578;, &#x4E26;&#x4E14;&#x66F4;&#x65B0;&#x4E86;&#x5167;&#x90E8;&#x7684; out &#x5168;&#x4FB7;&#x8B8A;&#x91CF;, &#x9019;&#x5169;&#x500B;&#x90FD;&#x662F;&#x672A;&#x5C0E;&#x9F63;&#x7684;, &#x56E0;&#x6B64;&#x5B83;&#x662F;&#x767D;&#x76D2;&#x6E2C;&#x8A66;.</p>
<p>&#x5679;&#x6211;&#x5011;&#x958B;&#x767C;TestEcho&#x6E2C;&#x8A66;&#x7684;&#x6642;&#x5019;, &#x6211;&#x5011;&#x8129;&#x6539;&#x4E86; echo &#x51FD;&#x6578;&#x4F7F;&#x7528;&#x5305;&#x7D1A;&#x7684; out &#x4F5C;&#x70BA;&#x8F38;&#x9F63;&#x5C0D;&#x8C61;, &#x56E0;&#x6B64;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x53EF;&#x4EE5;&#x7528;&#x53E6;&#x4E00;&#x500B;&#x5BE6;&#x73FE;&#x4EE3;&#x66FF;&#x6A19;&#x6E96;&#x8F38;&#x9F63;, &#x9019;&#x6A23;&#x53EF;&#x4EE5;&#x65B9;&#x4FBF;&#x5C0D;&#x6BD4; echo &#x7684;&#x8F38;&#x9F63;&#x6578;&#x64DA;. &#x4F7F;&#x7528;&#x985E;&#x4F3C;&#x7684;&#x6280;&#x8853;, &#x6211;&#x5011;&#x53EF;&#x4EE5;&#x5C07;&#x7522;&#x54C1;&#x4EE3;&#x78BC;&#x7684;&#x5176;&#x4ED6;&#x90E8;&#x5206;&#x4E5F;&#x66FF;&#x63DB;&#x70BA;&#x4E00;&#x500B;&#x5BB9;&#x6613;&#x6E2C;&#x8A66;&#x7684;&#x50DE;&#x5C0D;&#x8C61;. &#x4F7F;&#x7528;&#x50DE;&#x5C0D;&#x8C61;&#x7684;&#x597D;&#x8655;&#x662F;&#x6211;&#x5011;&#x53EF;&#x4EE5;&#x65B9;&#x4FBF;&#x914D;&#x7F6E;, &#x5BB9;&#x6613;&#x9810;&#x6E2C;, &#x66F4;&#x53EF;&#x9760;, &#x4E5F;&#x66F4;&#x5BB9;&#x6613;&#x89C0;&#x5BDF;. &#x8855;&#x6642;&#x4E5F;&#x53EF;&#x4EE5;&#x907F;&#x514D;&#x4E00;&#x4E9B;&#x4E0D;&#x826F;&#x7684;&#x526F;&#x4F5C;&#x7528;, &#x4F8B;&#x5982;&#x66F4;&#x65B0;&#x751F;&#x7522;&#x6578;&#x64DA;&#x5EAB;&#x6216;&#x4FE1;&#x7528;&#x5361;&#x6D88;&#x8CBB;&#x884C;&#x70BA;.</p>
<p>&#x4E0B;&#x9EAA;&#x7684;&#x4EE3;&#x78BC;&#x6F14;&#x793A;&#x4E86;&#x70BA;&#x7528;&#x6236;&#x63D0;&#x4F9B;&#x7DB2;&#x7D61;&#x5B58;&#x5132;&#x7684;web&#x670D;&#x52D9;&#x4E2D;&#x7684;&#x914D;&#x984D;&#x6AA2;&#x6E2C;&#x908F;&#x8F2F;. &#x5679;&#x7528;&#x6236;&#x4F7F;&#x7528;&#x4E86;&#x8D85;&#x904E; 90% &#x7684;&#x5B58;&#x5132;&#x914D;&#x984D;&#x4E4B;&#x5F8C;&#x5C07;&#x767C;&#x9001;&#x63D0;&#x9192;&#x90F5;&#x4EF6;.</p>
<p>&#x6211;&#x5011;&#x5DF2;&#x7D93;&#x770B;&#x5230;&#x5169;&#x7A2E;&#x6E2C;&#x8A66;&#x7684;&#x4F8B;&#x5B50;. TestIsPalindrome &#x6E2C;&#x8A66;&#x50C5;&#x50C5;&#x4F7F;&#x7528;&#x5C0E;&#x9F63;&#x7684; IsPalindrome &#x51FD;&#x6578;, &#x56E0;&#x6B64;&#x5B83;&#x662F;&#x4E00;&#x500B;&#x9ED1;&#x76D2;&#x6E2C;&#x8A66;. TestEcho &#x6E2C;&#x8A66;&#x5247;&#x8ABF;&#x7528;&#x4E86;&#x5167;&#x90E8;&#x7684; echo &#x51FD;&#x6578;, &#x4F75;&#x4E14;&#x66F4;&#x65B0;&#x4E86;&#x5167;&#x90E8;&#x7684; out &#x5168;&#x5C40;&#x8B8A;&#x91CF;, &#x9019;&#x5169;&#x500B;&#x90FD;&#x662F;&#x672A;&#x5C0E;&#x9F63;&#x7684;, &#x56E0;&#x6B64;&#x5B83;&#x662F;&#x767D;&#x76D2;&#x6E2C;&#x8A66;.</p>
<p>&#x7576;&#x6211;&#x5011;&#x958B;&#x767C;TestEcho&#x6E2C;&#x8A66;&#x7684;&#x6642;&#x5019;, &#x6211;&#x5011;&#x8129;&#x6539;&#x4E86; echo &#x51FD;&#x6578;&#x4F7F;&#x7528;&#x5305;&#x7D1A;&#x7684; out &#x4F5C;&#x7232;&#x8F38;&#x9F63;&#x5C0D;&#x8C61;, &#x56E0;&#x6B64;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x53EF;&#x4EE5;&#x7528;&#x53E6;&#x4E00;&#x500B;&#x5BE6;&#x73FE;&#x4EE3;&#x66FF;&#x6A19;&#x6E96;&#x8F38;&#x9F63;, &#x9019;&#x6A23;&#x53EF;&#x4EE5;&#x65B9;&#x4FBF;&#x5C0D;&#x6BD4; echo &#x7684;&#x8F38;&#x9F63;&#x6578;&#x64DA;. &#x4F7F;&#x7528;&#x985E;&#x4F3C;&#x7684;&#x6280;&#x8853;, &#x6211;&#x5011;&#x53EF;&#x4EE5;&#x5C07;&#x7523;&#x54C1;&#x4EE3;&#x78BC;&#x7684;&#x5176;&#x4ED6;&#x90E8;&#x5206;&#x4E5F;&#x66FF;&#x63DB;&#x7232;&#x4E00;&#x500B;&#x5BB9;&#x6613;&#x6E2C;&#x8A66;&#x7684;&#x50DE;&#x5C0D;&#x8C61;. &#x4F7F;&#x7528;&#x50DE;&#x5C0D;&#x8C61;&#x7684;&#x597D;&#x8655;&#x662F;&#x6211;&#x5011;&#x53EF;&#x4EE5;&#x65B9;&#x4FBF;&#x914D;&#x7F6E;, &#x5BB9;&#x6613;&#x9810;&#x6E2C;, &#x66F4;&#x53EF;&#x9760;, &#x4E5F;&#x66F4;&#x5BB9;&#x6613;&#x89C0;&#x5BDF;. &#x540C;&#x6642;&#x4E5F;&#x53EF;&#x4EE5;&#x907F;&#x514D;&#x4E00;&#x4E9B;&#x4E0D;&#x826F;&#x7684;&#x526F;&#x4F5C;&#x7528;, &#x4F8B;&#x5982;&#x66F4;&#x65B0;&#x751F;&#x7523;&#x6578;&#x64DA;&#x5EAB;&#x6216;&#x4FE1;&#x7528;&#x5361;&#x6D88;&#x8CBB;&#x884C;&#x7232;.</p>
<p>&#x4E0B;&#x9762;&#x7684;&#x4EE3;&#x78BC;&#x6F14;&#x793A;&#x4E86;&#x7232;&#x7528;&#x6236;&#x63D0;&#x4F9B;&#x7DB2;&#x7D61;&#x5B58;&#x5132;&#x7684;web&#x670D;&#x52D9;&#x4E2D;&#x7684;&#x914D;&#x984D;&#x6AA2;&#x6E2C;&#x908F;&#x8F2F;. &#x7576;&#x7528;&#x6236;&#x4F7F;&#x7528;&#x4E86;&#x8D85;&#x904E; 90% &#x7684;&#x5B58;&#x5132;&#x914D;&#x984D;&#x4E4B;&#x5F8C;&#x5C07;&#x767C;&#x9001;&#x63D0;&#x9192;&#x90F5;&#x4EF6;.</p>
<pre><code class="lang-Go">gopl.io/ch11/storage1
<span class="hljs-keyword">package</span> storage
@@ -2392,7 +2356,7 @@ FAIL gopl.io/ch11/echo 0.006s
}
}
</code></pre>
<p>&#x6211;&#x5011;&#x60F3;&#x6E2C;&#x8A66;&#x9019;&#x500B;&#x4EE3;&#x78BC;, &#x4F46;&#x662F;&#x6211;&#x5011;&#x4E26;&#x4E0D;&#x5E0C;&#x671B;&#x767C;&#x9001;&#x771E;&#x5BE6;&#x7684;&#x90F5;&#x4EF6;. &#x56E0;&#x6B64;&#x6211;&#x5011;&#x5C07;&#x90F5;&#x4EF6;&#x8655;&#x7406;&#x908F;&#x8F2F;&#x653E;&#x5230;&#x4E00;&#x500B;&#x4FEC;&#x6709;&#x7684; notifyUser &#x51FD;&#x6578;.</p>
<p>&#x6211;&#x5011;&#x60F3;&#x6E2C;&#x8A66;&#x9019;&#x500B;&#x4EE3;&#x78BC;, &#x4F46;&#x662F;&#x6211;&#x5011;&#x4F75;&#x4E0D;&#x5E0C;&#x671B;&#x767C;&#x9001;&#x771E;&#x5BE6;&#x7684;&#x90F5;&#x4EF6;. &#x56E0;&#x6B64;&#x6211;&#x5011;&#x5C07;&#x90F5;&#x4EF6;&#x8655;&#x7406;&#x908F;&#x8F2F;&#x653E;&#x5230;&#x4E00;&#x500B;&#x79C1;&#x6709;&#x7684; notifyUser &#x51FD;&#x6578;.</p>
<pre><code class="lang-Go">gopl.io/ch11/storage2
<span class="hljs-keyword">var</span> notifyUser = <span class="hljs-keyword">func</span>(username, msg <span class="hljs-typename">string</span>) {
@@ -2446,7 +2410,7 @@ FAIL gopl.io/ch11/echo 0.006s
}
}
</code></pre>
<p>&#x9019;&#x88E1;&#x6709;&#x4E00;&#x500B;&#x554F;&#x984C;: &#x5679;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x8FD4;&#x8FF4;&#x5F8C;, CheckQuota &#x5C07;&#x4E0D;&#x80FD;&#x6B63;&#x5E38;&#x5DE5;&#x4F5C;, &#x56E0;&#x70BA; notifyUsers &#x4F9D;&#x7136;&#x4F7F;&#x7528;&#x7684;&#x662F;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x7684;&#x50DE;&#x767C;&#x9001;&#x90F5;&#x4EF6;&#x51FD;&#x6578;. (&#x5679;&#x66F4;&#x65B0;&#x5168;&#x4FB7;&#x5C0D;&#x8C61;&#x7684;&#x6642;&#x5019;&#x7E3D;&#x6703;&#x6709;&#x9019;&#x7A2E;&#x98A8;&#x96AA;.) &#x6211;&#x5011;&#x5FC5;&#x9B1A;&#x8129;&#x6539;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x6062;&#x5FA9; notifyUsers &#x539F;&#x5148;&#x7684;&#x72C0;&#x614B;&#x4EE5;&#x4FBF;&#x5F8C;&#x7E8C;&#x5176;&#x4ED6;&#x7684;&#x6E2C;&#x8A66;&#x6C92;&#x6709;&#x5F71;&#x97FF;, &#x8981;&#x78BA;&#x4FDD;&#x6240;&#x6709;&#x7684;&#x57F7;&#x884C;&#x8DEF;&#x5F91;&#x5F8C;&#x90FD;&#x80FD;&#x6062;&#x5FA9;, &#x5305;&#x62EC;&#x6E2C;&#x8A66;&#x5931;&#x6557;&#x6216; panic &#x60C5;&#x5F62;. &#x5728;&#x9019;&#x7A2E;&#x60C5;&#x6CC1;&#x4E0B;, &#x6211;&#x5011;&#x5EFA;&#x8B70;&#x4F7F;&#x7528; defer &#x8655;&#x7406;&#x6062;&#x5FA9;&#x7684;&#x4EE3;&#x78BC;.</p>
<p>&#x9019;&#x91CC;&#x6709;&#x4E00;&#x500B;&#x554F;&#x984C;: &#x7576;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x8FD4;&#x8FF4;&#x5F8C;, CheckQuota &#x5C07;&#x4E0D;&#x80FD;&#x6B63;&#x5E38;&#x5DE5;&#x4F5C;, &#x56E0;&#x7232; notifyUsers &#x4F9D;&#x7136;&#x4F7F;&#x7528;&#x7684;&#x662F;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x7684;&#x50DE;&#x767C;&#x9001;&#x90F5;&#x4EF6;&#x51FD;&#x6578;. (&#x7576;&#x66F4;&#x65B0;&#x5168;&#x5C40;&#x5C0D;&#x8C61;&#x7684;&#x6642;&#x5019;&#x7E3D;&#x6703;&#x6709;&#x9019;&#x7A2E;&#x98A8;&#x96AA;.) &#x6211;&#x5011;&#x5FC5;&#x9B1A;&#x8129;&#x6539;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x6062;&#x8907; notifyUsers &#x539F;&#x5148;&#x7684;&#x72C0;&#x614B;&#x4EE5;&#x4FBF;&#x5F8C;&#x7E8C;&#x5176;&#x4ED6;&#x7684;&#x6E2C;&#x8A66;&#x6C92;&#x6709;&#x5F71;&#x97FF;, &#x8981;&#x78BA;&#x4FDD;&#x6240;&#x6709;&#x7684;&#x57F7;&#x884C;&#x8DEF;&#x5F91;&#x5F8C;&#x90FD;&#x80FD;&#x6062;&#x8907;, &#x5305;&#x62EC;&#x6E2C;&#x8A66;&#x5931;&#x6557;&#x6216; panic &#x60C5;&#x5F62;. &#x5728;&#x9019;&#x7A2E;&#x60C5;&#x6CC1;&#x4E0B;, &#x6211;&#x5011;&#x5EFA;&#x8B70;&#x4F7F;&#x7528; defer &#x8655;&#x7406;&#x6062;&#x8907;&#x7684;&#x4EE3;&#x78BC;.</p>
<pre><code class="lang-Go"><span class="hljs-keyword">func</span> TestCheckQuotaNotifiesUser(t *testing.T) {
<span class="hljs-comment">// Save and restore original notifyUser.</span>
saved := notifyUser
@@ -2460,38 +2424,38 @@ FAIL gopl.io/ch11/echo 0.006s
<span class="hljs-comment">// ...rest of test...</span>
}
</code></pre>
<p>&#x9019;&#x7A2E;&#x8655;&#x7406;&#x6A21;&#x5F0F;&#x53EF;&#x4EE5;&#x7528;&#x4F86;&#x66AB;&#x6642;&#x4FDD;&#x5B58;&#x548C;&#x6062;&#x5FA9;&#x6240;&#x6709;&#x7684;&#x5168;&#x4FB7;&#x8B8A;&#x91CF;, &#x5305;&#x62EC;&#x547D;&#x4EE4;&#x884C;&#x6A19;&#x8A8C;&#x53C3;&#x6578;, &#x8ABF;&#x8A66;&#x9078;&#x9805;, &#x548C;&#x512A;&#x5316;&#x53C3;&#x6578;; &#x5B89;&#x88DD;&#x548C;&#x79FB;&#x9664;&#x5C0E;&#x7DFB;&#x751F;&#x7522;&#x4EE3;&#x78BC;&#x7522;&#x751F;&#x4E00;&#x4E9B;&#x8ABF;&#x8A66;&#x4FE1;&#x606F;&#x7684;&#x920E;&#x5B50;&#x51FD;&#x6578;; &#x9084;&#x6709;&#x6709;&#x4E9B;&#x8A98;&#x5C0E;&#x751F;&#x7522;&#x4EE3;&#x78BC;&#x9032;&#x5165;&#x67D0;&#x4E9B;&#x91CD;&#x8981;&#x72C0;&#x614B;&#x7684;&#x6539;&#x8B8A;, &#x6BD4;&#x5982; &#x8D85;&#x6642;, &#x932F;&#x8AA4;, &#x751A;&#x81F3;&#x662F;&#x4E00;&#x4E9B;&#x523B;&#x610F;&#x88FD;&#x9020;&#x7684;&#x4E26;&#x767C;&#x884C;&#x70BA;.</p>
<p>&#x4EE5;&#x9019;&#x7A2E;&#x65B9;&#x5F0F;&#x4F7F;&#x7528;&#x5168;&#x4FB7;&#x8B8A;&#x91CF;&#x662F;&#x5B89;&#x5168;&#x7684;, &#x56E0;&#x70BA; go test &#x4E26;&#x4E0D;&#x6703;&#x8855;&#x6642;&#x4E26;&#x767C;&#x5730;&#x57F7;&#x884C;&#x591A;&#x500B;&#x6E2C;&#x8A66;.</p>
<p>&#x9019;&#x7A2E;&#x8655;&#x7406;&#x6A21;&#x5F0F;&#x53EF;&#x4EE5;&#x7528;&#x4F86;&#x66AB;&#x6642;&#x4FDD;&#x5B58;&#x548C;&#x6062;&#x8907;&#x6240;&#x6709;&#x7684;&#x5168;&#x5C40;&#x8B8A;&#x91CF;, &#x5305;&#x62EC;&#x547D;&#x4EE4;&#x884C;&#x6A19;&#x8A8C;&#x53C3;&#x6578;, &#x8ABF;&#x8A66;&#x9078;&#x9805;, &#x548C;&#x512A;&#x5316;&#x53C3;&#x6578;; &#x5B89;&#x88DD;&#x548C;&#x79FB;&#x9664;&#x5C0E;&#x81F4;&#x751F;&#x7523;&#x4EE3;&#x78BC;&#x7523;&#x751F;&#x4E00;&#x4E9B;&#x8ABF;&#x8A66;&#x4FE1;&#x606F;&#x7684;&#x9264;&#x5B50;&#x51FD;&#x6578;; &#x9084;&#x6709;&#x6709;&#x4E9B;&#x8A98;&#x5C0E;&#x751F;&#x7523;&#x4EE3;&#x78BC;&#x9032;&#x5165;&#x67D0;&#x4E9B;&#x91CD;&#x8981;&#x72C0;&#x614B;&#x7684;&#x6539;&#x8B8A;, &#x6BD4;&#x5982; &#x8D85;&#x6642;, &#x932F;&#x8AA4;, &#x751A;&#x81F3;&#x662F;&#x4E00;&#x4E9B;&#x523B;&#x610F;&#x88FD;&#x9020;&#x7684;&#x4F75;&#x767C;&#x884C;&#x7232;.</p>
<p>&#x4EE5;&#x9019;&#x7A2E;&#x65B9;&#x5F0F;&#x4F7F;&#x7528;&#x5168;&#x5C40;&#x8B8A;&#x91CF;&#x662F;&#x5B89;&#x5168;&#x7684;, &#x56E0;&#x7232; go test &#x4F75;&#x4E0D;&#x6703;&#x540C;&#x6642;&#x4F75;&#x767C;&#x5730;&#x57F7;&#x884C;&#x591A;&#x500B;&#x6E2C;&#x8A66;.</p>
<h3 id="1124-&#x64F4;&#x5C55;&#x6E2C;&#x8A66;&#x5305;">11.2.4. &#x64F4;&#x5C55;&#x6E2C;&#x8A66;&#x5305;</h3>
<p>&#x8003;&#x616E;&#x4E0B;&#x9019;&#x5169;&#x500B;&#x5305;: net/url &#x5305;, &#x63D0;&#x4F9B;&#x4E86; URL &#x89E3;&#x6790;&#x7684;&#x529F;&#x80FD;; net/http &#x5305;, &#x63D0;&#x4F9B;&#x4E86;web&#x670D;&#x52D9;&#x548C;HTTP&#x5BA2;&#x6236;&#x7AEF;&#x7684;&#x529F;&#x80FD;. &#x5982;&#x6211;&#x5011;&#x6240;&#x6599;, &#x4E0A;&#x5C64;&#x7684; net/http &#x5305;&#x4F9D;&#x8CF4;&#x4E0B;&#x5C64;&#x7684; net/url &#x5305;. &#x7136;&#x5F8C;, net/url &#x5305;&#x4E2D;&#x7684;&#x4E00;&#x500B;&#x6E2C;&#x8A66;&#x662F;&#x6F14;&#x793A;&#x4E0D;&#x8855;URL&#x548C;HTTP&#x5BA2;&#x6236;&#x7AEF;&#x7684;&#x4EA4;&#x4E92;&#x884C;&#x70BA;. &#x4E5F;&#x5C31;&#x662F;&#x8AAC;, &#x4E00;&#x500B;&#x4E0B;&#x5C64;&#x5305;&#x7684;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x5C0E;&#x5165;&#x4E86;&#x4E0A;&#x5C64;&#x7684;&#x5305;.</p>
<p>&#x8003;&#x616E;&#x4E0B;&#x9019;&#x5169;&#x500B;&#x5305;: net/url &#x5305;, &#x63D0;&#x4F9B;&#x4E86; URL &#x89E3;&#x6790;&#x7684;&#x529F;&#x80FD;; net/http &#x5305;, &#x63D0;&#x4F9B;&#x4E86;web&#x670D;&#x52D9;&#x548C;HTTP&#x5BA2;&#x6236;&#x7AEF;&#x7684;&#x529F;&#x80FD;. &#x5982;&#x6211;&#x5011;&#x6240;&#x6599;, &#x4E0A;&#x5C64;&#x7684; net/http &#x5305;&#x4F9D;&#x8CF4;&#x4E0B;&#x5C64;&#x7684; net/url &#x5305;. &#x7136;&#x5F8C;, net/url &#x5305;&#x4E2D;&#x7684;&#x4E00;&#x500B;&#x6E2C;&#x8A66;&#x662F;&#x6F14;&#x793A;&#x4E0D;&#x540C;URL&#x548C;HTTP&#x5BA2;&#x6236;&#x7AEF;&#x7684;&#x4EA4;&#x4E92;&#x884C;&#x7232;. &#x4E5F;&#x5C31;&#x662F;&#x8AAC;, &#x4E00;&#x500B;&#x4E0B;&#x5C64;&#x5305;&#x7684;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x5C0E;&#x5165;&#x4E86;&#x4E0A;&#x5C64;&#x7684;&#x5305;.</p>
<p><img src="../images/ch11-01.png" alt=""></p>
<p>&#x9019;&#x6A23;&#x7684;&#x884C;&#x70BA;&#x5728; net/url &#x5305;&#x7684;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x4E2D;&#x6703;&#x5C0E;&#x7DFB;&#x5305;&#x7684;&#x5FAA;&#x74B0;&#x4F9D;&#x8CF4;, &#x6B63;&#x5982; &#x5716;11.1&#x4E2D;&#x56AE;&#x4E0A;&#x7BAD;&#x982D;&#x6240;&#x793A;, &#x8855;&#x6642;&#x6B63;&#x5982;&#x6211;&#x5011;&#x5728; 10.1&#x7BC0;&#x6240;&#x8AAC;, Go&#x8A9E;&#x8A00;&#x898F;&#x7BC4;&#x662F;&#x7981;&#x6B62;&#x5305;&#x7684;&#x5FAA;&#x74B0;&#x4F9D;&#x8CF4;&#x7684;.</p>
<p>&#x6211;&#x5011;&#x53EF;&#x4EE5;&#x901A;&#x904E;&#x6E2C;&#x8A66;&#x64F4;&#x5C55;&#x5305;&#x7684;&#x65B9;&#x5F0F;&#x89E3;&#x6C7A;&#x5FAA;&#x74B0;&#x4F9D;&#x8CF4;&#x7684;&#x554F;&#x984C;, &#x4E5F;&#x5C31;&#x662F;&#x5728; net/url &#x5305;&#x6240;&#x5728;&#x7684;&#x76EE;&#x9332;&#x8072;&#x660E;&#x4E00;&#x500B; url_test &#x6E2C;&#x8A66;&#x64F4;&#x5C55;&#x5305;. &#x5176;&#x4E2D;&#x6E2C;&#x8A66;&#x64F4;&#x5C55;&#x5305;&#x540D;&#x7684; <code>_test</code> &#x5F8C;&#x7DB4;&#x544A;&#x8A34; go test &#x5DE5;&#x5177;&#x5B83;&#x61C9;&#x8A72;&#x5EFA;&#x7ACB;&#x4E00;&#x500B;&#x984D;&#x5916;&#x7684;&#x5305;&#x4F86;&#x904B;&#x884C;&#x6E2C;&#x8A66;. &#x6211;&#x5011;&#x5C07;&#x9019;&#x500B;&#x64F4;&#x5C55;&#x6E2C;&#x8A66;&#x5305;&#x7684;&#x5C0E;&#x5165;&#x8DEF;&#x5F91;&#x8996;&#x4F5C;&#x662F; net/url_test &#x6703;&#x66F4;&#x5BB9;&#x6613;&#x7406;&#x89E3;, &#x4F46;&#x5BE6;&#x969B;&#x4E0A;&#x5B83;&#x4E26;&#x4E0D;&#x80FD;&#x88AB;&#x5176;&#x4ED6;&#x4EFB;&#x4F55;&#x5305;&#x5C0E;&#x5165;.</p>
<p>&#x56E0;&#x70BA;&#x6E2C;&#x8A66;&#x64F4;&#x5C55;&#x5305;&#x662F;&#x4E00;&#x500B;&#x7368;&#x7ACB;&#x7684;&#x5305;, &#x56E0;&#x6B64;&#x53EF;&#x4EE5;&#x5C0E;&#x5165;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x4F9D;&#x8CF4;&#x7684;&#x5176;&#x4ED6;&#x7684;&#x8F14;&#x52A9;&#x5305;; &#x5305;&#x5167;&#x7684;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x53EF;&#x80FD;&#x7121;&#x6CD5;&#x505A;&#x5230;. &#x5728;&#x8A2D;&#x8A08;&#x5C64;&#x9EAA;, &#x6E2C;&#x8A66;&#x64F4;&#x5C55;&#x5305;&#x662F;&#x5728;&#x6240;&#x4EE5;&#x5B83;&#x4F9D;&#x8CF4;&#x7684;&#x5305;&#x7684;&#x4E0A;&#x5C64;, &#x6B63;&#x5982; &#x5716;11.2&#x6240;&#x793A;.</p>
<p>&#x9019;&#x6A23;&#x7684;&#x884C;&#x7232;&#x5728; net/url &#x5305;&#x7684;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x4E2D;&#x6703;&#x5C0E;&#x81F4;&#x5305;&#x7684;&#x5FAA;&#x74B0;&#x4F9D;&#x8CF4;, &#x6B63;&#x5982; &#x5716;11.1&#x4E2D;&#x5411;&#x4E0A;&#x7BAD;&#x982D;&#x6240;&#x793A;, &#x540C;&#x6642;&#x6B63;&#x5982;&#x6211;&#x5011;&#x5728; 10.1&#x7BC0;&#x6240;&#x8AAC;, Go&#x8A9E;&#x8A00;&#x898F;&#x8303;&#x662F;&#x7981;&#x6B62;&#x5305;&#x7684;&#x5FAA;&#x74B0;&#x4F9D;&#x8CF4;&#x7684;.</p>
<p>&#x6211;&#x5011;&#x53EF;&#x4EE5;&#x901A;&#x904E;&#x6E2C;&#x8A66;&#x64F4;&#x5C55;&#x5305;&#x7684;&#x65B9;&#x5F0F;&#x89E3;&#x6C7A;&#x5FAA;&#x74B0;&#x4F9D;&#x8CF4;&#x7684;&#x554F;&#x984C;, &#x4E5F;&#x5C31;&#x662F;&#x5728; net/url &#x5305;&#x6240;&#x5728;&#x7684;&#x76EE;&#x9332;&#x8072;&#x660E;&#x4E00;&#x500B; url_test &#x6E2C;&#x8A66;&#x64F4;&#x5C55;&#x5305;. &#x5176;&#x4E2D;&#x6E2C;&#x8A66;&#x64F4;&#x5C55;&#x5305;&#x540D;&#x7684; <code>_test</code> &#x5F8C;&#x7DB4;&#x544A;&#x8A34; go test &#x5DE5;&#x5177;&#x5B83;&#x61C9;&#x8A72;&#x5EFA;&#x7ACB;&#x4E00;&#x500B;&#x984D;&#x5916;&#x7684;&#x5305;&#x4F86;&#x904B;&#x884C;&#x6E2C;&#x8A66;. &#x6211;&#x5011;&#x5C07;&#x9019;&#x500B;&#x64F4;&#x5C55;&#x6E2C;&#x8A66;&#x5305;&#x7684;&#x5C0E;&#x5165;&#x8DEF;&#x5F91;&#x8996;&#x4F5C;&#x662F; net/url_test &#x6703;&#x66F4;&#x5BB9;&#x6613;&#x7406;&#x89E3;, &#x4F46;&#x5BE6;&#x969B;&#x4E0A;&#x5B83;&#x4F75;&#x4E0D;&#x80FD;&#x88AB;&#x5176;&#x4ED6;&#x4EFB;&#x4F55;&#x5305;&#x5C0E;&#x5165;.</p>
<p>&#x56E0;&#x7232;&#x6E2C;&#x8A66;&#x64F4;&#x5C55;&#x5305;&#x662F;&#x4E00;&#x500B;&#x7368;&#x7ACB;&#x7684;&#x5305;, &#x56E0;&#x6B64;&#x53EF;&#x4EE5;&#x5C0E;&#x5165;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x4F9D;&#x8CF4;&#x7684;&#x5176;&#x4ED6;&#x7684;&#x8F14;&#x52A9;&#x5305;; &#x5305;&#x5167;&#x7684;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x53EF;&#x80FD;&#x7121;&#x6CD5;&#x505A;&#x5230;. &#x5728;&#x8A2D;&#x8A08;&#x5C64;&#x9762;, &#x6E2C;&#x8A66;&#x64F4;&#x5C55;&#x5305;&#x662F;&#x5728;&#x6240;&#x4EE5;&#x5B83;&#x4F9D;&#x8CF4;&#x7684;&#x5305;&#x7684;&#x4E0A;&#x5C64;, &#x6B63;&#x5982; &#x5716;11.2&#x6240;&#x793A;.</p>
<p><img src="../images/ch11-02.png" alt=""></p>
<p>&#x901A;&#x904E;&#x8FF4;&#x907F;&#x5FAA;&#x74B0;&#x5C0E;&#x5165;&#x4F9D;&#x8CF4;, &#x64F4;&#x5C55;&#x6E2C;&#x8A66;&#x5305;&#x53EF;&#x4EE5;&#x66F4;&#x9748;&#x6D3B;&#x7684;&#x6E2C;&#x8A66;, &#x7279;&#x5F46;&#x662F;&#x96C6;&#x6210;&#x6E2C;&#x8A66;(&#x9700;&#x8981;&#x6E2C;&#x8A66;&#x591A;&#x500B;&#x7D44;&#x4EF6;&#x4E4B;&#x9593;&#x7684;&#x4EA4;&#x4E92;), &#x53EF;&#x4EE5;&#x50CF;&#x666E;&#x901A;&#x61C9;&#x7528;&#x7A0B;&#x5E8F;&#x90A3;&#x6A23;&#x81EA;&#x7531;&#x5730;&#x5C0E;&#x5165;&#x5176;&#x4ED6;&#x5305;.</p>
<p>&#x6211;&#x5011;&#x53EF;&#x4EE5;&#x7528; go list &#x5DE5;&#x5177;&#x67FB;&#x770B;&#x5305;&#x5C0D;&#x61C9;&#x76EE;&#x9332;&#x4E2D;&#x54EA;&#x4E9B;Go&#x6E90;&#x6587;&#x4EF6;&#x662F;&#x7522;&#x54C1;&#x4EE3;&#x78BC;, &#x54EA;&#x4E9B;&#x662F;&#x5305;&#x5167;&#x6E2C;&#x8A66;, &#x9084;&#x54EA;&#x4E9B;&#x6E2C;&#x8A66;&#x64F4;&#x5C55;&#x5305;. &#x6211;&#x5011;&#x4EE5; fmt &#x5305;&#x4F5C;&#x70BA;&#x4E00;&#x500B;&#x4F8B;&#x5B50;. GoFiles &#x9336;&#x793A;&#x7522;&#x54C1;&#x4EE3;&#x78BC;&#x5C0D;&#x61C9;&#x7684;Go&#x6E90;&#x6587;&#x4EF6;&#x5217;&#x9336;; &#x4E5F;&#x5C31;&#x662F; go build &#x547D;&#x4EE4;&#x8981;&#x7DE8;&#x8B6F;&#x7684;&#x90E8;&#x5206;:</p>
<p>&#x901A;&#x904E;&#x8FF4;&#x907F;&#x5FAA;&#x74B0;&#x5C0E;&#x5165;&#x4F9D;&#x8CF4;, &#x64F4;&#x5C55;&#x6E2C;&#x8A66;&#x5305;&#x53EF;&#x4EE5;&#x66F4;&#x9748;&#x6D3B;&#x7684;&#x6E2C;&#x8A66;, &#x7279;&#x522B;&#x662F;&#x96C6;&#x6210;&#x6E2C;&#x8A66;(&#x9700;&#x8981;&#x6E2C;&#x8A66;&#x591A;&#x500B;&#x7D44;&#x4EF6;&#x4E4B;&#x9593;&#x7684;&#x4EA4;&#x4E92;), &#x53EF;&#x4EE5;&#x50CF;&#x666E;&#x901A;&#x61C9;&#x7528;&#x7A0B;&#x5E8F;&#x90A3;&#x6A23;&#x81EA;&#x7531;&#x5730;&#x5C0E;&#x5165;&#x5176;&#x4ED6;&#x5305;.</p>
<p>&#x6211;&#x5011;&#x53EF;&#x4EE5;&#x7528; go list &#x5DE5;&#x5177;&#x67FB;&#x770B;&#x5305;&#x5C0D;&#x61C9;&#x76EE;&#x9332;&#x4E2D;&#x54EA;&#x4E9B;Go&#x6E90;&#x6587;&#x4EF6;&#x662F;&#x7523;&#x54C1;&#x4EE3;&#x78BC;, &#x54EA;&#x4E9B;&#x662F;&#x5305;&#x5167;&#x6E2C;&#x8A66;, &#x9084;&#x54EA;&#x4E9B;&#x6E2C;&#x8A66;&#x64F4;&#x5C55;&#x5305;. &#x6211;&#x5011;&#x4EE5; fmt &#x5305;&#x4F5C;&#x7232;&#x4E00;&#x500B;&#x4F8B;&#x5B50;. GoFiles &#x8868;&#x793A;&#x7523;&#x54C1;&#x4EE3;&#x78BC;&#x5C0D;&#x61C9;&#x7684;Go&#x6E90;&#x6587;&#x4EF6;&#x5217;&#x8868;; &#x4E5F;&#x5C31;&#x662F; go build &#x547D;&#x4EE4;&#x8981;&#x7DE8;&#x8B6F;&#x7684;&#x90E8;&#x5206;:</p>
<pre><code>$ go list -f={{.GoFiles}} fmt
[doc.go format.go print.go scan.go]
</code></pre><p>TestGoFiles &#x9336;&#x793A;&#x7684;&#x662F; fmt &#x5305;&#x5167;&#x90E8;&#x6E2C;&#x8A66;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;, &#x4EE5; _test.go &#x70BA;&#x5F8C;&#x7DB4;&#x6587;&#x4EF6;&#x540D;, &#x4E0D;&#x904E;&#x96BB;&#x5728;&#x6E2C;&#x8A66;&#x6642;&#x88AB;&#x69CB;&#x5EFA;:</p>
</code></pre><p>TestGoFiles &#x8868;&#x793A;&#x7684;&#x662F; fmt &#x5305;&#x5167;&#x90E8;&#x6E2C;&#x8A66;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;, &#x4EE5; _test.go &#x7232;&#x5F8C;&#x7DB4;&#x6587;&#x4EF6;&#x540D;, &#x4E0D;&#x904E;&#x96BB;&#x5728;&#x6E2C;&#x8A66;&#x6642;&#x88AB;&#x69CB;&#x5EFA;:</p>
<pre><code>$ go list -f={{.TestGoFiles}} fmt
[export_test.go]
</code></pre><p>&#x5305;&#x7684;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x901A;&#x5E38;&#x90FD;&#x5728;&#x9019;&#x4E9B;&#x6587;&#x4EF6;&#x4E2D;, &#x4E0D;&#x904E; fmt &#x5305;&#x4E26;&#x975E;&#x5982;&#x6B64;; &#x7A0D;&#x5F8C;&#x6211;&#x5011;&#x518D;&#x89E3;&#x91CB; export_test.go &#x6587;&#x4EF6;&#x7684;&#x4F5C;&#x7528;.</p>
<p>XTestGoFiles &#x9336;&#x793A;&#x7684;&#x662F;&#x5C6C;&#x65BC;&#x6E2C;&#x8A66;&#x64F4;&#x5C55;&#x5305;&#x7684;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;, &#x4E5F;&#x5C31;&#x662F; fmt_test &#x5305;, &#x56E0;&#x6B64;&#x5B83;&#x5011;&#x5FC5;&#x9B1A;&#x5148;&#x5C0E;&#x5165; fmt &#x5305;. &#x8855;&#x6A23;, &#x9019;&#x4E9B;&#x6587;&#x4EF6;&#x4E5F;&#x96BB;&#x662F;&#x5728;&#x6E2C;&#x8A66;&#x6642;&#x88AB;&#x69CB;&#x5EFA;&#x904B;&#x884C;:</p>
</code></pre><p>&#x5305;&#x7684;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x901A;&#x5E38;&#x90FD;&#x5728;&#x9019;&#x4E9B;&#x6587;&#x4EF6;&#x4E2D;, &#x4E0D;&#x904E; fmt &#x5305;&#x4F75;&#x975E;&#x5982;&#x6B64;; &#x7A0D;&#x5F8C;&#x6211;&#x5011;&#x518D;&#x89E3;&#x91CB; export_test.go &#x6587;&#x4EF6;&#x7684;&#x4F5C;&#x7528;.</p>
<p>XTestGoFiles &#x8868;&#x793A;&#x7684;&#x662F;&#x5C6C;&#x65BC;&#x6E2C;&#x8A66;&#x64F4;&#x5C55;&#x5305;&#x7684;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;, &#x4E5F;&#x5C31;&#x662F; fmt_test &#x5305;, &#x56E0;&#x6B64;&#x5B83;&#x5011;&#x5FC5;&#x9B1A;&#x5148;&#x5C0E;&#x5165; fmt &#x5305;. &#x540C;&#x6A23;, &#x9019;&#x4E9B;&#x6587;&#x4EF6;&#x4E5F;&#x96BB;&#x662F;&#x5728;&#x6E2C;&#x8A66;&#x6642;&#x88AB;&#x69CB;&#x5EFA;&#x904B;&#x884C;:</p>
<pre><code>$ go list -f={{.XTestGoFiles}} fmt
[fmt_test.go scan_test.go stringer_test.go]
</code></pre><p>&#x6709;&#x6642;&#x5019;&#x6E2C;&#x8A66;&#x64F4;&#x5C55;&#x5305;&#x9700;&#x8981;&#x8A2A;&#x554F;&#x88AB;&#x6E2C;&#x8A66;&#x5305;&#x5167;&#x90E8;&#x7684;&#x4EE3;&#x78BC;, &#x4F8B;&#x5982;&#x5728;&#x4E00;&#x500B;&#x70BA;&#x4E86;&#x907F;&#x514D;&#x5FAA;&#x74B0;&#x5C0E;&#x5165;&#x800C;&#x88AB;&#x7368;&#x7ACB;&#x5230;&#x5916;&#x90E8;&#x6E2C;&#x8A66;&#x64F4;&#x5C55;&#x5305;&#x7684;&#x767D;&#x76D2;&#x6E2C;&#x8A66;. &#x5728;&#x9019;&#x7A2E;&#x60C5;&#x6CC1;&#x4E0B;, &#x6211;&#x5011;&#x53EF;&#x4EE5;&#x901A;&#x904E;&#x4E00;&#x4E9B;&#x6280;&#x5DE7;&#x89E3;&#x6C7A;: &#x6211;&#x5011;&#x5728;&#x5305;&#x5167;&#x7684;&#x4E00;&#x500B; _test.go &#x6587;&#x4EF6;&#x4E2D;&#x5C0E;&#x9F63;&#x4E00;&#x500B;&#x5167;&#x90E8;&#x7684;&#x5BE6;&#x73FE;&#x7D66;&#x6E2C;&#x8A66;&#x64F4;&#x5C55;&#x5305;. &#x56E0;&#x70BA;&#x9019;&#x4E9B;&#x4EE3;&#x78BC;&#x96BB;&#x6709;&#x5728;&#x6E2C;&#x8A66;&#x6642;&#x7E94;&#x9700;&#x8981;, &#x56E0;&#x6B64;&#x4E00;&#x822C;&#x653E;&#x5728; export_test.go &#x6587;&#x4EF6;&#x4E2D;.</p>
<p>&#x4F8B;&#x5982;, fmt &#x5305;&#x7684; fmt.Scanf &#x9700;&#x8981; unicode.IsSpace &#x51FD;&#x6578;&#x63D0;&#x4F9B;&#x7684;&#x529F;&#x80FD;. &#x4F46;&#x662F;&#x70BA;&#x4E86;&#x907F;&#x514D;&#x592A;&#x591A;&#x7684;&#x4F9D;&#x8CF4;, fmt &#x5305;&#x4E26;&#x6C92;&#x6709;&#x5C0E;&#x5165;&#x5305;&#x542B;&#x9245;&#x5927;&#x9336;&#x683C;&#x6578;&#x64DA;&#x7684; unicode &#x5305;; &#x76F8;&#x53CD;fmt&#x5305;&#x6709;&#x4E00;&#x500B;&#x53EB; isSpace &#x5167;&#x90E8;&#x7684;&#x7C21;&#x6613;&#x5BE6;&#x73FE;.</p>
<p>&#x70BA;&#x4E86;&#x78BA;&#x4FDD; fmt.isSpace &#x548C; unicode.IsSpace &#x51FD;&#x6578;&#x7684;&#x884C;&#x70BA;&#x4E00;&#x7DFB;, fmt &#x5305;&#x8B39;&#x614E;&#x5730;&#x5305;&#x542B;&#x4E86;&#x4E00;&#x500B;&#x6E2C;&#x8A66;. &#x662F;&#x4E00;&#x500B;&#x5728;&#x6E2C;&#x8A66;&#x64F4;&#x5C55;&#x5305;&#x5167;&#x7684;&#x6E2C;&#x8A66;, &#x56E0;&#x6B64;&#x662F;&#x7121;&#x6CD5;&#x76F4;&#x63A5;&#x8A2A;&#x554F;&#x5230; isSpace &#x5167;&#x90E8;&#x51FD;&#x6578;&#x7684;, &#x56E0;&#x6B64; fmt &#x901A;&#x904E;&#x4E00;&#x500B;&#x7955;&#x5BC6;&#x9F63;&#x53E3;&#x5C0E;&#x9F63;&#x4E86; isSpace &#x51FD;&#x6578;. export_test.go &#x6587;&#x4EF6;&#x5C31;&#x662F;&#x5C08;&#x9580;&#x7528;&#x65BC;&#x6E2C;&#x8A66;&#x64F4;&#x5C55;&#x5305;&#x7684;&#x7955;&#x5BC6;&#x9F63;&#x53E3;.</p>
</code></pre><p>&#x6709;&#x6642;&#x5019;&#x6E2C;&#x8A66;&#x64F4;&#x5C55;&#x5305;&#x9700;&#x8981;&#x8A2A;&#x554F;&#x88AB;&#x6E2C;&#x8A66;&#x5305;&#x5167;&#x90E8;&#x7684;&#x4EE3;&#x78BC;, &#x4F8B;&#x5982;&#x5728;&#x4E00;&#x500B;&#x7232;&#x4E86;&#x907F;&#x514D;&#x5FAA;&#x74B0;&#x5C0E;&#x5165;&#x800C;&#x88AB;&#x7368;&#x7ACB;&#x5230;&#x5916;&#x90E8;&#x6E2C;&#x8A66;&#x64F4;&#x5C55;&#x5305;&#x7684;&#x767D;&#x76D2;&#x6E2C;&#x8A66;. &#x5728;&#x9019;&#x7A2E;&#x60C5;&#x6CC1;&#x4E0B;, &#x6211;&#x5011;&#x53EF;&#x4EE5;&#x901A;&#x904E;&#x4E00;&#x4E9B;&#x6280;&#x5DE7;&#x89E3;&#x6C7A;: &#x6211;&#x5011;&#x5728;&#x5305;&#x5167;&#x7684;&#x4E00;&#x500B; _test.go &#x6587;&#x4EF6;&#x4E2D;&#x5C0E;&#x9F63;&#x4E00;&#x500B;&#x5167;&#x90E8;&#x7684;&#x5BE6;&#x73FE;&#x7D66;&#x6E2C;&#x8A66;&#x64F4;&#x5C55;&#x5305;. &#x56E0;&#x7232;&#x9019;&#x4E9B;&#x4EE3;&#x78BC;&#x96BB;&#x6709;&#x5728;&#x6E2C;&#x8A66;&#x6642;&#x7E94;&#x9700;&#x8981;, &#x56E0;&#x6B64;&#x4E00;&#x822C;&#x653E;&#x5728; export_test.go &#x6587;&#x4EF6;&#x4E2D;.</p>
<p>&#x4F8B;&#x5982;, fmt &#x5305;&#x7684; fmt.Scanf &#x9700;&#x8981; unicode.IsSpace &#x51FD;&#x6578;&#x63D0;&#x4F9B;&#x7684;&#x529F;&#x80FD;. &#x4F46;&#x662F;&#x7232;&#x4E86;&#x907F;&#x514D;&#x592A;&#x591A;&#x7684;&#x4F9D;&#x8CF4;, fmt &#x5305;&#x4F75;&#x6C92;&#x6709;&#x5C0E;&#x5165;&#x5305;&#x542B;&#x9245;&#x5927;&#x8868;&#x683C;&#x6578;&#x64DA;&#x7684; unicode &#x5305;; &#x76F8;&#x53CD;fmt&#x5305;&#x6709;&#x4E00;&#x500B;&#x53EB; isSpace &#x5167;&#x90E8;&#x7684;&#x7C21;&#x6613;&#x5BE6;&#x73FE;.</p>
<p>&#x7232;&#x4E86;&#x78BA;&#x4FDD; fmt.isSpace &#x548C; unicode.IsSpace &#x51FD;&#x6578;&#x7684;&#x884C;&#x7232;&#x4E00;&#x81F4;, fmt &#x5305;&#x8B39;&#x614E;&#x5730;&#x5305;&#x542B;&#x4E86;&#x4E00;&#x500B;&#x6E2C;&#x8A66;. &#x662F;&#x4E00;&#x500B;&#x5728;&#x6E2C;&#x8A66;&#x64F4;&#x5C55;&#x5305;&#x5167;&#x7684;&#x6E2C;&#x8A66;, &#x56E0;&#x6B64;&#x662F;&#x7121;&#x6CD5;&#x76F4;&#x63A5;&#x8A2A;&#x554F;&#x5230; isSpace &#x5167;&#x90E8;&#x51FD;&#x6578;&#x7684;, &#x56E0;&#x6B64; fmt &#x901A;&#x904E;&#x4E00;&#x500B;&#x7955;&#x5BC6;&#x9F63;&#x53E3;&#x5C0E;&#x9F63;&#x4E86; isSpace &#x51FD;&#x6578;. export_test.go &#x6587;&#x4EF6;&#x5C31;&#x662F;&#x5C08;&#x9580;&#x7528;&#x65BC;&#x6E2C;&#x8A66;&#x64F4;&#x5C55;&#x5305;&#x7684;&#x7955;&#x5BC6;&#x9F63;&#x53E3;.</p>
<pre><code class="lang-Go"><span class="hljs-keyword">package</span> fmt
<span class="hljs-keyword">var</span> IsSpace = isSpace
</code></pre>
<p>&#x9019;&#x500B;&#x6E2C;&#x8A66;&#x6587;&#x4EF6;&#x4E26;&#x6C92;&#x6709;&#x5B9A;&#x7FA9;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;; &#x5B83;&#x96BB;&#x662F;&#x901A;&#x904E; fmt.IsSpace &#x7C21;&#x55AE;&#x5C0E;&#x9F63;&#x4E86;&#x5167;&#x90E8;&#x7684; isSpace &#x51FD;&#x6578;, &#x63D0;&#x4F9B;&#x7D66;&#x6E2C;&#x8A66;&#x64F4;&#x5C55;&#x5305;&#x4F7F;&#x7528;. &#x9019;&#x500B;&#x6280;&#x5DE7;&#x53EF;&#x4EE5;&#x5EE3;&#x6C4E;&#x7528;&#x65BC;&#x4F4D;&#x65BC;&#x6E2C;&#x8A66;&#x64F4;&#x5C55;&#x5305;&#x7684;&#x767D;&#x76D2;&#x6E2C;&#x8A66;.</p>
<p>&#x9019;&#x500B;&#x6E2C;&#x8A66;&#x6587;&#x4EF6;&#x4F75;&#x6C92;&#x6709;&#x5B9A;&#x7FA9;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;; &#x5B83;&#x96BB;&#x662F;&#x901A;&#x904E; fmt.IsSpace &#x7C21;&#x55AE;&#x5C0E;&#x9F63;&#x4E86;&#x5167;&#x90E8;&#x7684; isSpace &#x51FD;&#x6578;, &#x63D0;&#x4F9B;&#x7D66;&#x6E2C;&#x8A66;&#x64F4;&#x5C55;&#x5305;&#x4F7F;&#x7528;. &#x9019;&#x500B;&#x6280;&#x5DE7;&#x53EF;&#x4EE5;&#x5EE3;&#x6CDB;&#x7528;&#x65BC;&#x4F4D;&#x65BC;&#x6E2C;&#x8A66;&#x64F4;&#x5C55;&#x5305;&#x7684;&#x767D;&#x76D2;&#x6E2C;&#x8A66;.</p>
<h3 id="1125-&#x7DE8;&#x5BEB;&#x6709;&#x6548;&#x7684;&#x6E2C;&#x8A66;">11.2.5. &#x7DE8;&#x5BEB;&#x6709;&#x6548;&#x7684;&#x6E2C;&#x8A66;</h3>
<p>&#x8A31;&#x591A;Go&#x65B0;&#x4EBA;&#x6703;&#x9A5A;&#x7570;&#x8207;&#x5B83;&#x7684;&#x6975;&#x7C21;&#x7684;&#x6E2C;&#x8A66;&#x6846;&#x67B6;. &#x5F88;&#x591A;&#x5176;&#x4ED6;&#x8A9E;&#x8A00;&#x7684;&#x6E2C;&#x8A66;&#x6846;&#x67B6;&#x90FD;&#x63D0;&#x4F9B;&#x4E86;&#x8B58;&#x5F46;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x7684;&#x6A5F;&#x88FD;(&#x901A;&#x5E38;&#x4F7F;&#x7528;&#x53CD;&#x5C04;&#x6216;&#x5143;&#x6578;&#x64DA;), &#x901A;&#x904E;&#x8A2D;&#x7F6E;&#x4E00;&#x4E9B; &#x2018;&#x2018;setup&#x2019;&#x2019; &#x548C; &#x2018;&#x2018;teardown&#x2019;&#x2019; &#x7684;&#x920E;&#x5B50;&#x51FD;&#x6578;&#x4F86;&#x57F7;&#x884C;&#x6E2C;&#x8A66;&#x7528;&#x4F8B;&#x904B;&#x884C;&#x7684;&#x521D;&#x59CB;&#x5316;&#x6216;&#x4E4B;&#x5F8C;&#x7684;&#x6E05;&#x7406;&#x64CD;&#x4F5C;, &#x8855;&#x6642;&#x6E2C;&#x8A66;&#x5DE5;&#x5177;&#x7BB1;&#x9084;&#x63D0;&#x4F9B;&#x4E86;&#x5F88;&#x591A;&#x985E;&#x4F3C;assert&#x65B7;&#x8A00;, &#x6BD4;&#x8F03;&#x503C;, &#x683C;&#x5F0F;&#x5316;&#x8F38;&#x9F63;&#x932F;&#x8AA4;&#x4FE1;&#x606F;&#x548C;&#x505C;&#x6B62;&#x4E00;&#x500B;&#x8B58;&#x5F46;&#x7684;&#x6E2C;&#x8A66;&#x7B49;&#x8F14;&#x52A9;&#x51FD;&#x6578;(&#x901A;&#x5E38;&#x4F7F;&#x7528;&#x7570;&#x5E38;&#x6A5F;&#x88FD;). &#x96D6;&#x7136;&#x9019;&#x4E9B;&#x6A5F;&#x88FD;&#x53EF;&#x4EE5;&#x4F7F;&#x5F97;&#x6E2C;&#x8A66;&#x975E;&#x5E38;&#x7C21;&#x6F54;, &#x4F46;&#x662F;&#x6E2C;&#x8A66;&#x8F38;&#x9F63;&#x7684;&#x65E5;&#x8A8C;&#x537B;&#x50CF;&#x706B;&#x661F;&#x6587;&#x4E00;&#x822C;&#x96E3;&#x4EE5;&#x7406;&#x89E3;. &#x6B64;&#x5916;, &#x96D6;&#x7136;&#x6E2C;&#x8A66;&#x6700;&#x7D42;&#x4E5F;&#x6703;&#x8F38;&#x9F63; PASS &#x6216; FAIL &#x7684;&#x5831;&#x544A;, &#x4F46;&#x662F;&#x5B83;&#x5011;&#x63D0;&#x4F9B;&#x7684;&#x4FE1;&#x606F;&#x683C;&#x5F0F;&#x537B;&#x975E;&#x5E38;&#x4E0D;&#x5229;&#x65BC;&#x4EE3;&#x78BC;&#x7DAD;&#x8B77;&#x8005;&#x5FEB;&#x901F;&#x5B9A;&#x4F4D;&#x554F;&#x984C;, &#x56E0;&#x70BA;&#x5931;&#x6557;&#x7684;&#x4FE1;&#x606F;&#x7684;&#x5177;&#x9AD4;&#x542B;&#x7FA9;&#x662F;&#x975E;&#x5E38;&#x96B1;&#x60A3;&#x7684;, &#x6BD4;&#x5982; &quot;assert: 0 == 1&quot; &#x6216; &#x6210;&#x9801;&#x7684;&#x6D77;&#x91CF;&#x8DDF;&#x8E64;&#x65E5;&#x8A8C;.</p>
<p>Go&#x8A9E;&#x8A00;&#x7684;&#x6E2C;&#x8A66;&#x98A8;&#x683C;&#x5247;&#x5F62;&#x6210;&#x9BAE;&#x660E;&#x5C0D;&#x6BD4;. &#x5B83;&#x671F;&#x671B;&#x6E2C;&#x8A66;&#x8005;&#x81EA;&#x5DF1;&#x5B8C;&#x6210;&#x5927;&#x90E8;&#x5206;&#x7684;&#x5DE5;&#x4F5C;, &#x5B9A;&#x7FA9;&#x51FD;&#x6578;&#x907F;&#x514D;&#x91CD;&#x5FA9;, &#x5C31;&#x50CF;&#x666E;&#x901A;&#x7DE8;&#x7A0B;&#x90A3;&#x6A23;. &#x7DE8;&#x5BEB;&#x6E2C;&#x8A66;&#x4E26;&#x4E0D;&#x662F;&#x4E00;&#x500B;&#x6A5F;&#x68B0;&#x7684;&#x586B;&#x5145;&#x904E;&#x7A0B;; &#x4E00;&#x500B;&#x6E2C;&#x8A66;&#x4E5F;&#x6709;&#x81EA;&#x5DF1;&#x7684;&#x63A5;&#x53E3;, &#x76E1;&#x7BA1;&#x5B83;&#x7684;&#x7DAD;&#x8B77;&#x8005;&#x4E5F;&#x662F;&#x6E2C;&#x8A66;&#x50C5;&#x6709;&#x7684;&#x4E00;&#x500B;&#x7528;&#x6236;. &#x4E00;&#x500B;&#x597D;&#x7684;&#x6E2C;&#x8A66;&#x4E0D;&#x61C9;&#x8A72;&#x5F15;&#x767C;&#x5176;&#x4ED6;&#x7121;&#x95DC;&#x7684;&#x932F;&#x8AA4;&#x4FE1;&#x606F;, &#x5B83;&#x96BB;&#x8981;&#x6E05;&#x6670;&#x7C21;&#x6F54;&#x5730;&#x63CF;&#x8FF0;&#x554F;&#x984C;&#x7684;&#x7665;&#x72C0;&#x537D;&#x53EF;, &#x6709;&#x6642;&#x5019;&#x53EF;&#x80FD;&#x9084;&#x9700;&#x8981;&#x4E00;&#x4E9B;&#x4E0A;&#x4E0B;&#x6587;&#x4FE1;&#x606F;. &#x5728;&#x7406;&#x60F3;&#x60C5;&#x6CC1;&#x4E0B;, &#x7DAD;&#x8B77;&#x8005;&#x53EF;&#x4EE5;&#x5728;&#x4E0D;&#x770B;&#x4EE3;&#x78BC;&#x7684;&#x60C5;&#x6CC1;&#x4E0B;&#x5C31;&#x80FD;&#x6839;&#x64DA;&#x932F;&#x8AA4;&#x4FE1;&#x606F;&#x5B9A;&#x4F4D;&#x932F;&#x8AA4;&#x7522;&#x751F;&#x7684;&#x539F;&#x56E0;. &#x4E00;&#x500B;&#x597D;&#x7684;&#x6E2C;&#x8A66;&#x4E0D;&#x61C9;&#x8A72;&#x5728;&#x9047;&#x5230;&#x4E00;&#x9EDE;&#x5C0F;&#x932F;&#x8AA4;&#x5C31;&#x7ACB;&#x523B;&#x9000;&#x9F63;&#x6E2C;&#x8A66;, &#x5B83;&#x61C9;&#x8A72;&#x5617;&#x8A66;&#x5831;&#x544A;&#x66F4;&#x591A;&#x7684;&#x6E2C;&#x8A66;, &#x56E0;&#x6B64;&#x6211;&#x5011;&#x53EF;&#x80FD;&#x5F9E;&#x591A;&#x500B;&#x5931;&#x6557;&#x6E2C;&#x8A66;&#x7684;&#x6A21;&#x5F0F;&#x4E2D;&#x767C;&#x73FE;&#x932F;&#x8AA4;&#x7522;&#x751F;&#x7684;&#x898F;&#x5F8B;.</p>
<p>&#x4E0B;&#x9EAA;&#x7684;&#x65B7;&#x8A00;&#x51FD;&#x6578;&#x6BD4;&#x8F03;&#x5169;&#x500B;&#x503C;, &#x7136;&#x5F8C;&#x751F;&#x6210;&#x4E00;&#x500B;&#x901A;&#x7528;&#x7684;&#x932F;&#x8AA4;&#x4FE1;&#x606F;, &#x4E26;&#x505C;&#x6B62;&#x7A0B;&#x5E8F;. &#x5B83;&#x5F88;&#x65B9;&#x4FBF;&#x4F7F;&#x7528;&#x4E5F;&#x78BA;&#x5BE6;&#x6709;&#x6548;&#x679C;, &#x4F46;&#x662F;&#x5679;&#x8B58;&#x5F46;&#x7684;&#x6642;&#x5019;, &#x932F;&#x8AA4;&#x6642;&#x6253;&#x5370;&#x7684;&#x4FE1;&#x606F;&#x5E7E;&#x4E4E;&#x662F;&#x6C92;&#x6709;&#x50F9;&#x503C;&#x7684;. &#x5B83;&#x4E26;&#x6C92;&#x6709;&#x70BA;&#x89E3;&#x6C7A;&#x554F;&#x984C;&#x63D0;&#x4F9B;&#x4E00;&#x500B;&#x5F88;&#x597D;&#x7684;&#x5165;&#x53E3;.</p>
<p>&#x8A31;&#x591A;Go&#x65B0;&#x4EBA;&#x6703;&#x9A5A;&#x7570;&#x8207;&#x5B83;&#x7684;&#x6975;&#x7C21;&#x7684;&#x6E2C;&#x8A66;&#x6846;&#x67B6;. &#x5F88;&#x591A;&#x5176;&#x4ED6;&#x8A9E;&#x8A00;&#x7684;&#x6E2C;&#x8A66;&#x6846;&#x67B6;&#x90FD;&#x63D0;&#x4F9B;&#x4E86;&#x8B58;&#x522B;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x7684;&#x6A5F;&#x88FD;(&#x901A;&#x5E38;&#x4F7F;&#x7528;&#x53CD;&#x5C04;&#x6216;&#x5143;&#x6578;&#x64DA;), &#x901A;&#x904E;&#x8A2D;&#x7F6E;&#x4E00;&#x4E9B; &#x2018;&#x2018;setup&#x2019;&#x2019; &#x548C; &#x2018;&#x2018;teardown&#x2019;&#x2019; &#x7684;&#x9264;&#x5B50;&#x51FD;&#x6578;&#x4F86;&#x57F7;&#x884C;&#x6E2C;&#x8A66;&#x7528;&#x4F8B;&#x904B;&#x884C;&#x7684;&#x521D;&#x59CB;&#x5316;&#x6216;&#x4E4B;&#x5F8C;&#x7684;&#x6E05;&#x7406;&#x64CD;&#x4F5C;, &#x540C;&#x6642;&#x6E2C;&#x8A66;&#x5DE5;&#x5177;&#x7BB1;&#x9084;&#x63D0;&#x4F9B;&#x4E86;&#x5F88;&#x591A;&#x985E;&#x4F3C;assert&#x65B7;&#x8A00;, &#x6BD4;&#x8F03;&#x503C;, &#x683C;&#x5F0F;&#x5316;&#x8F38;&#x9F63;&#x932F;&#x8AA4;&#x4FE1;&#x606F;&#x548C;&#x505C;&#x6B62;&#x4E00;&#x500B;&#x8B58;&#x522B;&#x7684;&#x6E2C;&#x8A66;&#x7B49;&#x8F14;&#x52A9;&#x51FD;&#x6578;(&#x901A;&#x5E38;&#x4F7F;&#x7528;&#x7570;&#x5E38;&#x6A5F;&#x88FD;). &#x96D6;&#x7136;&#x9019;&#x4E9B;&#x6A5F;&#x88FD;&#x53EF;&#x4EE5;&#x4F7F;&#x5F97;&#x6E2C;&#x8A66;&#x975E;&#x5E38;&#x7C21;&#x6F54;, &#x4F46;&#x662F;&#x6E2C;&#x8A66;&#x8F38;&#x9F63;&#x7684;&#x65E5;&#x8A8C;&#x537B;&#x50CF;&#x706B;&#x661F;&#x6587;&#x4E00;&#x822C;&#x96E3;&#x4EE5;&#x7406;&#x89E3;. &#x6B64;&#x5916;, &#x96D6;&#x7136;&#x6E2C;&#x8A66;&#x6700;&#x7D42;&#x4E5F;&#x6703;&#x8F38;&#x9F63; PASS &#x6216; FAIL &#x7684;&#x5831;&#x544A;, &#x4F46;&#x662F;&#x5B83;&#x5011;&#x63D0;&#x4F9B;&#x7684;&#x4FE1;&#x606F;&#x683C;&#x5F0F;&#x537B;&#x975E;&#x5E38;&#x4E0D;&#x5229;&#x65BC;&#x4EE3;&#x78BC;&#x7DAD;&#x8B77;&#x8005;&#x5FEB;&#x901F;&#x5B9A;&#x4F4D;&#x554F;&#x984C;, &#x56E0;&#x7232;&#x5931;&#x6557;&#x7684;&#x4FE1;&#x606F;&#x7684;&#x5177;&#x9AD4;&#x542B;&#x7FA9;&#x662F;&#x975E;&#x5E38;&#x96B1;&#x60A3;&#x7684;, &#x6BD4;&#x5982; &quot;assert: 0 == 1&quot; &#x6216; &#x6210;&#x9801;&#x7684;&#x6D77;&#x91CF;&#x8DDF;&#x8E64;&#x65E5;&#x8A8C;.</p>
<p>Go&#x8A9E;&#x8A00;&#x7684;&#x6E2C;&#x8A66;&#x98A8;&#x683C;&#x5247;&#x5F62;&#x6210;&#x9BAE;&#x660E;&#x5C0D;&#x6BD4;. &#x5B83;&#x671F;&#x671B;&#x6E2C;&#x8A66;&#x8005;&#x81EA;&#x5DF1;&#x5B8C;&#x6210;&#x5927;&#x90E8;&#x5206;&#x7684;&#x5DE5;&#x4F5C;, &#x5B9A;&#x7FA9;&#x51FD;&#x6578;&#x907F;&#x514D;&#x91CD;&#x8907;, &#x5C31;&#x50CF;&#x666E;&#x901A;&#x7DE8;&#x7A0B;&#x90A3;&#x6A23;. &#x7DE8;&#x5BEB;&#x6E2C;&#x8A66;&#x4F75;&#x4E0D;&#x662F;&#x4E00;&#x500B;&#x6A5F;&#x68B0;&#x7684;&#x586B;&#x5145;&#x904E;&#x7A0B;; &#x4E00;&#x500B;&#x6E2C;&#x8A66;&#x4E5F;&#x6709;&#x81EA;&#x5DF1;&#x7684;&#x63A5;&#x53E3;, &#x76E1;&#x7BA1;&#x5B83;&#x7684;&#x7DAD;&#x8B77;&#x8005;&#x4E5F;&#x662F;&#x6E2C;&#x8A66;&#x50C5;&#x6709;&#x7684;&#x4E00;&#x500B;&#x7528;&#x6236;. &#x4E00;&#x500B;&#x597D;&#x7684;&#x6E2C;&#x8A66;&#x4E0D;&#x61C9;&#x8A72;&#x5F15;&#x767C;&#x5176;&#x4ED6;&#x7121;&#x95DC;&#x7684;&#x932F;&#x8AA4;&#x4FE1;&#x606F;, &#x5B83;&#x96BB;&#x8981;&#x6E05;&#x6670;&#x7C21;&#x6F54;&#x5730;&#x63CF;&#x8FF0;&#x554F;&#x984C;&#x7684;&#x7665;&#x72C0;&#x537D;&#x53EF;, &#x6709;&#x6642;&#x5019;&#x53EF;&#x80FD;&#x9084;&#x9700;&#x8981;&#x4E00;&#x4E9B;&#x4E0A;&#x4E0B;&#x6587;&#x4FE1;&#x606F;. &#x5728;&#x7406;&#x60F3;&#x60C5;&#x6CC1;&#x4E0B;, &#x7DAD;&#x8B77;&#x8005;&#x53EF;&#x4EE5;&#x5728;&#x4E0D;&#x770B;&#x4EE3;&#x78BC;&#x7684;&#x60C5;&#x6CC1;&#x4E0B;&#x5C31;&#x80FD;&#x6839;&#x64DA;&#x932F;&#x8AA4;&#x4FE1;&#x606F;&#x5B9A;&#x4F4D;&#x932F;&#x8AA4;&#x7523;&#x751F;&#x7684;&#x539F;&#x56E0;. &#x4E00;&#x500B;&#x597D;&#x7684;&#x6E2C;&#x8A66;&#x4E0D;&#x61C9;&#x8A72;&#x5728;&#x9047;&#x5230;&#x4E00;&#x9EDE;&#x5C0F;&#x932F;&#x8AA4;&#x5C31;&#x7ACB;&#x523B;&#x9000;&#x9F63;&#x6E2C;&#x8A66;, &#x5B83;&#x61C9;&#x8A72;&#x5690;&#x8A66;&#x5831;&#x544A;&#x66F4;&#x591A;&#x7684;&#x6E2C;&#x8A66;, &#x56E0;&#x6B64;&#x6211;&#x5011;&#x53EF;&#x80FD;&#x5F9E;&#x591A;&#x500B;&#x5931;&#x6557;&#x6E2C;&#x8A66;&#x7684;&#x6A21;&#x5F0F;&#x4E2D;&#x767C;&#x73FE;&#x932F;&#x8AA4;&#x7523;&#x751F;&#x7684;&#x898F;&#x5F8B;.</p>
<p>&#x4E0B;&#x9762;&#x7684;&#x65B7;&#x8A00;&#x51FD;&#x6578;&#x6BD4;&#x8F03;&#x5169;&#x500B;&#x503C;, &#x7136;&#x5F8C;&#x751F;&#x6210;&#x4E00;&#x500B;&#x901A;&#x7528;&#x7684;&#x932F;&#x8AA4;&#x4FE1;&#x606F;, &#x4F75;&#x505C;&#x6B62;&#x7A0B;&#x5E8F;. &#x5B83;&#x5F88;&#x65B9;&#x4FBF;&#x4F7F;&#x7528;&#x4E5F;&#x78BA;&#x5BE6;&#x6709;&#x6548;&#x679C;, &#x4F46;&#x662F;&#x7576;&#x8B58;&#x522B;&#x7684;&#x6642;&#x5019;, &#x932F;&#x8AA4;&#x6642;&#x6253;&#x5370;&#x7684;&#x4FE1;&#x606F;&#x5E7E;&#x4E4E;&#x662F;&#x6C92;&#x6709;&#x50F9;&#x503C;&#x7684;. &#x5B83;&#x4F75;&#x6C92;&#x6709;&#x7232;&#x89E3;&#x6C7A;&#x554F;&#x984C;&#x63D0;&#x4F9B;&#x4E00;&#x500B;&#x5F88;&#x597D;&#x7684;&#x5165;&#x53E3;.</p>
<pre><code class="lang-Go"><span class="hljs-keyword">import</span> (
<span class="hljs-string">&quot;fmt&quot;</span>
<span class="hljs-string">&quot;strings&quot;</span>
@@ -2509,7 +2473,7 @@ FAIL gopl.io/ch11/echo 0.006s
<span class="hljs-comment">// ...</span>
}
</code></pre>
<p>&#x5F9E;&#x9019;&#x500B;&#x610F;&#x7FA9;&#x4E0A;&#x8AAC;, &#x65B7;&#x8A00;&#x51FD;&#x6578;&#x72AF;&#x4E86;&#x904E;&#x65E9;&#x62BD;&#x8C61;&#x7684;&#x932F;&#x8AA4;: &#x50C5;&#x50C5;&#x6E2C;&#x8A66;&#x5169;&#x500B;&#x6574;&#x6578;&#x662F;&#x5426;&#x76F8;&#x8855;, &#x800C;&#x653E;&#x68C4;&#x4E86;&#x6839;&#x64DA;&#x4E0A;&#x4E0B;&#x6587;&#x63D0;&#x4F9B;&#x66F4;&#x6709;&#x610F;&#x7FA9;&#x7684;&#x932F;&#x8AA4;&#x4FE1;&#x606F;&#x7684;&#x505A;&#x6CD5;. &#x6211;&#x5011;&#x53EF;&#x4EE5;&#x6839;&#x64DA;&#x5177;&#x9AD4;&#x7684;&#x932F;&#x8AA4;&#x6253;&#x5370;&#x4E00;&#x500B;&#x66F4;&#x6709;&#x50F9;&#x503C;&#x7684;&#x932F;&#x8AA4;&#x4FE1;&#x606F;, &#x5C31;&#x50CF;&#x4E0B;&#x9EAA;&#x4F8B;&#x5B50;&#x90A3;&#x6A23;. &#x6E2C;&#x8A66;&#x5728;&#x96BB;&#x6709;&#x4E00;&#x6B21;&#x91CD;&#x5FA9;&#x7684;&#x6A21;&#x5F0F;&#x9F63;&#x73FE;&#x6642;&#x5F15;&#x5165;&#x62BD;&#x8C61;.</p>
<p>&#x5F9E;&#x9019;&#x500B;&#x610F;&#x7FA9;&#x4E0A;&#x8AAC;, &#x65B7;&#x8A00;&#x51FD;&#x6578;&#x72AF;&#x4E86;&#x904E;&#x65E9;&#x62BD;&#x8C61;&#x7684;&#x932F;&#x8AA4;: &#x50C5;&#x50C5;&#x6E2C;&#x8A66;&#x5169;&#x500B;&#x6574;&#x6578;&#x662F;&#x5426;&#x76F8;&#x540C;, &#x800C;&#x653E;&#x68C4;&#x4E86;&#x6839;&#x64DA;&#x4E0A;&#x4E0B;&#x6587;&#x63D0;&#x4F9B;&#x66F4;&#x6709;&#x610F;&#x7FA9;&#x7684;&#x932F;&#x8AA4;&#x4FE1;&#x606F;&#x7684;&#x505A;&#x6CD5;. &#x6211;&#x5011;&#x53EF;&#x4EE5;&#x6839;&#x64DA;&#x5177;&#x9AD4;&#x7684;&#x932F;&#x8AA4;&#x6253;&#x5370;&#x4E00;&#x500B;&#x66F4;&#x6709;&#x50F9;&#x503C;&#x7684;&#x932F;&#x8AA4;&#x4FE1;&#x606F;, &#x5C31;&#x50CF;&#x4E0B;&#x9762;&#x4F8B;&#x5B50;&#x90A3;&#x6A23;. &#x6E2C;&#x8A66;&#x5728;&#x96BB;&#x6709;&#x4E00;&#x6B21;&#x91CD;&#x8907;&#x7684;&#x6A21;&#x5F0F;&#x9F63;&#x73FE;&#x6642;&#x5F15;&#x5165;&#x62BD;&#x8C61;.</p>
<pre><code class="lang-Go"><span class="hljs-keyword">func</span> TestSplit(t *testing.T) {
s, sep := <span class="hljs-string">&quot;a:b:c&quot;</span>, <span class="hljs-string">&quot;:&quot;</span>
words := strings.Split(s, sep)
@@ -2520,13 +2484,13 @@ FAIL gopl.io/ch11/echo 0.006s
<span class="hljs-comment">// ...</span>
}
</code></pre>
<p>&#x73FE;&#x5728;&#x7684;&#x6E2C;&#x8A66;&#x4E0D;&#x50C5;&#x5831;&#x544A;&#x4E86;&#x8ABF;&#x7528;&#x7684;&#x5177;&#x9AD4;&#x51FD;&#x6578;, &#x5B83;&#x7684;&#x8F38;&#x5165;, &#x548C;&#x7D50;&#x679C;&#x7684;&#x610F;&#x7FA9;; &#x4E26;&#x4E14;&#x6253;&#x5370;&#x7684;&#x771E;&#x5BE6;&#x8FD4;&#x8FF4;&#x7684;&#x503C;&#x548C;&#x671F;&#x671B;&#x8FD4;&#x8FF4;&#x7684;&#x503C;; &#x4E26;&#x4E14;&#x537D;&#x4F7F;&#x65B7;&#x8A00;&#x5931;&#x6557;&#x4F9D;&#x7136;&#x6703;&#x7E7C;&#x7E8C;&#x5617;&#x8A66;&#x904B;&#x884C;&#x66F4;&#x591A;&#x7684;&#x6E2C;&#x8A66;. &#x4E00;&#x65E6;&#x6211;&#x5011;&#x5BEB;&#x4E86;&#x9019;&#x6A23;&#x7D50;&#x69CB;&#x7684;&#x6E2C;&#x8A66;, &#x4E0B;&#x4E00;&#x6B65;&#x81EA;&#x7136;&#x4E0D;&#x662F;&#x7528;&#x66F4;&#x591A;&#x7684;if&#x8A9E;&#x53E5;&#x4F86;&#x64F4;&#x5C55;&#x6E2C;&#x8A66;&#x7528;&#x4F8B;, &#x6211;&#x5011;&#x53EF;&#x4EE5;&#x7528;&#x50CF; IsPalindrome &#x7684;&#x9336;&#x9A45;&#x52D5;&#x6E2C;&#x8A66;&#x90A3;&#x6A23;&#x4F86;&#x6E96;&#x5099;&#x66F4;&#x591A;&#x7684; s, sep &#x6E2C;&#x8A66;&#x7528;&#x4F8B;.</p>
<p>&#x524D;&#x9EAA;&#x7684;&#x4F8B;&#x5B50;&#x4E26;&#x4E0D;&#x9700;&#x8981;&#x984D;&#x5916;&#x7684;&#x8F14;&#x52A9;&#x51FD;&#x6578;, &#x5982;&#x679C;&#x5982;&#x679C;&#x6709;&#x53EF;&#x4EE5;&#x4F7F;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x66F4;&#x7C21;&#x55AE;&#x7684;&#x65B9;&#x6CD5;&#x6211;&#x5011;&#x4E5F;&#x6A02;&#x610F;&#x63A5;&#x53D7;. (&#x6211;&#x5011;&#x5C07;&#x5728; 13.3&#x7BC0; &#x770B;&#x5230;&#x4E00;&#x500B; reflect.DeepEqual &#x8F14;&#x52A9;&#x51FD;&#x6578;.) &#x958B;&#x59CB;&#x4E00;&#x500B;&#x597D;&#x7684;&#x6E2C;&#x8A66;&#x7684;&#x95DC;&#x9375;&#x662F;&#x901A;&#x904E;&#x5BE6;&#x73FE;&#x4F60;&#x771E;&#x6B63;&#x60F3;&#x8981;&#x7684;&#x5177;&#x9AD4;&#x884C;&#x70BA;, &#x7136;&#x5F8C;&#x7E94;&#x662F;&#x8003;&#x616E;&#x7136;&#x5F8C;&#x7C21;&#x5316;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;. &#x6700;&#x597D;&#x7684;&#x7D50;&#x679C;&#x662F;&#x76F4;&#x63A5;&#x5F9E;&#x5EAB;&#x7684;&#x62BD;&#x8C61;&#x63A5;&#x53E3;&#x958B;&#x59CB;, &#x91DD;&#x5C0D;&#x516C;&#x5171;&#x63A5;&#x53E3;&#x7DE8;&#x5BEB;&#x4E00;&#x4E9B;&#x6E2C;&#x8A66;&#x51FD;&#x6578;.</p>
<p><strong>&#x7DF4;&#x7FD2;11.5:</strong> &#x7528;&#x9336;&#x683C;&#x9A45;&#x52D5;&#x7684;&#x6280;&#x8853;&#x64F4;&#x5C55;TestSplit&#x6E2C;&#x8A66;, &#x4E26;&#x6253;&#x5370;&#x671F;&#x671B;&#x7684;&#x8F38;&#x9F63;&#x7D50;&#x679C;.</p>
<p>&#x73FE;&#x5728;&#x7684;&#x6E2C;&#x8A66;&#x4E0D;&#x50C5;&#x5831;&#x544A;&#x4E86;&#x8ABF;&#x7528;&#x7684;&#x5177;&#x9AD4;&#x51FD;&#x6578;, &#x5B83;&#x7684;&#x8F38;&#x5165;, &#x548C;&#x7D50;&#x679C;&#x7684;&#x610F;&#x7FA9;; &#x4F75;&#x4E14;&#x6253;&#x5370;&#x7684;&#x771E;&#x5BE6;&#x8FD4;&#x8FF4;&#x7684;&#x503C;&#x548C;&#x671F;&#x671B;&#x8FD4;&#x8FF4;&#x7684;&#x503C;; &#x4F75;&#x4E14;&#x537D;&#x4F7F;&#x65B7;&#x8A00;&#x5931;&#x6557;&#x4F9D;&#x7136;&#x6703;&#x7E7C;&#x7E8C;&#x5690;&#x8A66;&#x904B;&#x884C;&#x66F4;&#x591A;&#x7684;&#x6E2C;&#x8A66;. &#x4E00;&#x65E6;&#x6211;&#x5011;&#x5BEB;&#x4E86;&#x9019;&#x6A23;&#x7D50;&#x69CB;&#x7684;&#x6E2C;&#x8A66;, &#x4E0B;&#x4E00;&#x6B65;&#x81EA;&#x7136;&#x4E0D;&#x662F;&#x7528;&#x66F4;&#x591A;&#x7684;if&#x8A9E;&#x53E5;&#x4F86;&#x64F4;&#x5C55;&#x6E2C;&#x8A66;&#x7528;&#x4F8B;, &#x6211;&#x5011;&#x53EF;&#x4EE5;&#x7528;&#x50CF; IsPalindrome &#x7684;&#x8868;&#x9A45;&#x52D5;&#x6E2C;&#x8A66;&#x90A3;&#x6A23;&#x4F86;&#x6E96;&#x5099;&#x66F4;&#x591A;&#x7684; s, sep &#x6E2C;&#x8A66;&#x7528;&#x4F8B;.</p>
<p>&#x524D;&#x9762;&#x7684;&#x4F8B;&#x5B50;&#x4F75;&#x4E0D;&#x9700;&#x8981;&#x984D;&#x5916;&#x7684;&#x8F14;&#x52A9;&#x51FD;&#x6578;, &#x5982;&#x679C;&#x5982;&#x679C;&#x6709;&#x53EF;&#x4EE5;&#x4F7F;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x66F4;&#x7C21;&#x55AE;&#x7684;&#x65B9;&#x6CD5;&#x6211;&#x5011;&#x4E5F;&#x6A02;&#x610F;&#x63A5;&#x53D7;. (&#x6211;&#x5011;&#x5C07;&#x5728; 13.3&#x7BC0; &#x770B;&#x5230;&#x4E00;&#x500B; reflect.DeepEqual &#x8F14;&#x52A9;&#x51FD;&#x6578;.) &#x958B;&#x59CB;&#x4E00;&#x500B;&#x597D;&#x7684;&#x6E2C;&#x8A66;&#x7684;&#x95DC;&#x9375;&#x662F;&#x901A;&#x904E;&#x5BE6;&#x73FE;&#x4F60;&#x771E;&#x6B63;&#x60F3;&#x8981;&#x7684;&#x5177;&#x9AD4;&#x884C;&#x7232;, &#x7136;&#x5F8C;&#x7E94;&#x662F;&#x8003;&#x616E;&#x7136;&#x5F8C;&#x7C21;&#x5316;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;. &#x6700;&#x597D;&#x7684;&#x7D50;&#x679C;&#x662F;&#x76F4;&#x63A5;&#x5F9E;&#x5EAB;&#x7684;&#x62BD;&#x8C61;&#x63A5;&#x53E3;&#x958B;&#x59CB;, &#x91DD;&#x5C0D;&#x516C;&#x5171;&#x63A5;&#x53E3;&#x7DE8;&#x5BEB;&#x4E00;&#x4E9B;&#x6E2C;&#x8A66;&#x51FD;&#x6578;.</p>
<p><strong>&#x7DF4;&#x7FD2;11.5:</strong> &#x7528;&#x8868;&#x683C;&#x9A45;&#x52D5;&#x7684;&#x6280;&#x8853;&#x64F4;&#x5C55;TestSplit&#x6E2C;&#x8A66;, &#x4F75;&#x6253;&#x5370;&#x671F;&#x671B;&#x7684;&#x8F38;&#x9F63;&#x7D50;&#x679C;.</p>
<h3 id="1126-&#x907F;&#x514D;&#x7684;&#x4E0D;&#x7A69;&#x5B9A;&#x7684;&#x6E2C;&#x8A66;">11.2.6. &#x907F;&#x514D;&#x7684;&#x4E0D;&#x7A69;&#x5B9A;&#x7684;&#x6E2C;&#x8A66;</h3>
<p>&#x5982;&#x679C;&#x4E00;&#x500B;&#x61C9;&#x7528;&#x7A0B;&#x5E8F;&#x5C0D;&#x65BC;&#x65B0;&#x9F63;&#x73FE;&#x7684;&#x4F46;&#x6709;&#x6548;&#x7684;&#x8F38;&#x5165;&#x7D93;&#x5E38;&#x5931;&#x6557;&#x8AAC;&#x660E;&#x7A0B;&#x5E8F;&#x4E0D;&#x5920;&#x7A69;&#x5065;; &#x8855;&#x6A23;&#x5982;&#x679C;&#x4E00;&#x500B;&#x6E2C;&#x8A66;&#x50C5;&#x50C5;&#x56E0;&#x70BA;&#x8072;&#x97F3;&#x8B8A;&#x5316;&#x5C31;&#x6703;&#x5C0E;&#x7DFB;&#x5931;&#x6557;&#x4E5F;&#x662F;&#x4E0D;&#x95A4;&#x908F;&#x8F2F;&#x7684;. &#x5C31;&#x50CF;&#x4E00;&#x500B;&#x4E0D;&#x5920;&#x7A69;&#x5065;&#x7684;&#x7A0B;&#x5E8F;&#x6703;&#x632B;&#x6557;&#x5B83;&#x7684;&#x7528;&#x6236;&#x4E00;&#x6A23;, &#x4E00;&#x500B;&#x8106;&#x5F31;&#x6027;&#x6E2C;&#x8A66;&#x8855;&#x6A23;&#x6703;&#x6FC0;&#x6012;&#x5B83;&#x7684;&#x7DAD;&#x8B77;&#x8005;. &#x6700;&#x8106;&#x5F31;&#x7684;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x6703;&#x5728;&#x7A0B;&#x5E8F;&#x6C92;&#x6709;&#x4EFB;&#x4F55;&#x8B8A;&#x5316;&#x7684;&#x6642;&#x5019;&#x7522;&#x751F;&#x4E0D;&#x8855;&#x7684;&#x7D50;&#x679C;, &#x6642;&#x597D;&#x6642;&#x58DE;, &#x8655;&#x7406;&#x5B83;&#x5011;&#x6703;&#x8017;&#x8CBB;&#x5927;&#x91CF;&#x7684;&#x6642;&#x9593;&#x4F46;&#x662F;&#x4E26;&#x4E0D;&#x6703;&#x5F97;&#x5230;&#x4EFB;&#x4F55;&#x597D;&#x8655;.</p>
<p>&#x5679;&#x4E00;&#x500B;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x7522;&#x751F;&#x4E00;&#x500B;&#x5FA9;&#x96DC;&#x7684;&#x8F38;&#x9F63;&#x5982;&#x4E00;&#x500B;&#x5F88;&#x9577;&#x7684;&#x5B57;&#x7B26;&#x4E32;, &#x6216;&#x4E00;&#x500B;&#x7CBE;&#x5FC3;&#x8A2D;&#x8A08;&#x7684;&#x6578;&#x64DA;&#x7D50;&#x69CB;, &#x6216;&#x4E00;&#x500B;&#x6587;&#x4EF6;, &#x5B83;&#x53EF;&#x4EE5;&#x7528;&#x65BC;&#x548C;&#x9810;&#x8A2D;&#x7684;&#x2018;&#x2018;golden&#x2019;&#x2019;&#x7D50;&#x679C;&#x6578;&#x64DA;&#x5C0D;&#x6BD4;, &#x7528;&#x9019;&#x7A2E;&#x7C21;&#x55AE;&#x65B9;&#x5F0F;&#x5BEB;&#x6E2C;&#x8A66;&#x662F;&#x8A98;&#x4EBA;&#x7684;. &#x4F46;&#x662F;&#x96A8;&#x7740;&#x9805;&#x76EE;&#x7684;&#x767C;&#x5C55;, &#x8F38;&#x9F63;&#x7684;&#x67D0;&#x4E9B;&#x90E8;&#x5206;&#x5F88;&#x53EF;&#x80FD;&#x6703;&#x767C;&#x751F;&#x8B8A;&#x5316;, &#x76E1;&#x7BA1;&#x5F88;&#x53EF;&#x80FD;&#x662F;&#x4E00;&#x500B;&#x6539;&#x9032;&#x7684;&#x5BE6;&#x73FE;&#x5C0E;&#x7DFB;&#x7684;. &#x800C;&#x4E14;&#x4E0D;&#x50C5;&#x50C5;&#x662F;&#x8F38;&#x9F63;&#x90E8;&#x5206;, &#x51FD;&#x6578;&#x5FA9;&#x96DC;&#x5FA9;&#x88FD;&#x7684;&#x8F38;&#x5165;&#x90E8;&#x5206;&#x53EF;&#x80FD;&#x4E5F;&#x8DDF;&#x7740;&#x8B8A;&#x5316;&#x4E86;, &#x56E0;&#x6B64;&#x6E2C;&#x8A66;&#x4F7F;&#x7528;&#x7684;&#x8F38;&#x5165;&#x4E5F;&#x5C31;&#x4E0D;&#x5728;&#x6709;&#x6548;&#x4E86;.</p>
<p>&#x907F;&#x514D;&#x8106;&#x5F31;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x7684;&#x65B9;&#x6CD5;&#x662F;&#x96BB;&#x6AA2;&#x6E2C;&#x4F60;&#x771E;&#x6B63;&#x95DC;&#x5FC3;&#x7684;&#x5C6C;&#x6027;. &#x4FDD;&#x5B58;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x7684;&#x7C21;&#x6F54;&#x548C;&#x5167;&#x90E8;&#x7D50;&#x69CB;&#x7684;&#x7A69;&#x5B9A;. &#x7279;&#x5F46;&#x662F;&#x5C0D;&#x65B7;&#x8A00;&#x90E8;&#x5206;&#x8981;&#x6709;&#x6240;&#x9078;&#x64C7;. &#x4E0D;&#x8981;&#x6AA2;&#x67FB;&#x5B57;&#x7B26;&#x4E32;&#x7684;&#x5168;&#x5339;&#x914D;, &#x4F46;&#x662F;&#x5C0B;&#x627E;&#x76F8;&#x95DC;&#x7684;&#x5B50;&#x5B57;&#x7B26;&#x4E32;, &#x56E0;&#x70BA;&#x67D0;&#x4E9B;&#x5B50;&#x5B57;&#x7B26;&#x4E32;&#x5728;&#x9805;&#x76EE;&#x7684;&#x767C;&#x5C55;&#x4E2D;&#x662F;&#x6BD4;&#x8F03;&#x7A69;&#x5B9A;&#x4E0D;&#x8B8A;&#x7684;. &#x901A;&#x5E38;&#x7DE8;&#x5BEB;&#x4E00;&#x500B;&#x91CD;&#x5FA9;&#x96DC;&#x7684;&#x8F38;&#x9F63;&#x4E2D;&#x63D0;&#x53D6;&#x5FC5;&#x8981;&#x7CBE;&#x83EF;&#x4FE1;&#x606F;&#x4EE5;&#x7528;&#x65BC;&#x65B7;&#x8A00;&#x662F;&#x503C;&#x5F97;&#x7684;, &#x96D6;&#x7136;&#x9019;&#x53EF;&#x80FD;&#x6703;&#x5E36;&#x4F86;&#x5F88;&#x591A;&#x524D;&#x671F;&#x7684;&#x5DE5;&#x4F5C;, &#x4F46;&#x662F;&#x5B83;&#x53EF;&#x4EE5;&#x5E6B;&#x52A9;&#x8FC5;&#x901F;&#x53CA;&#x6642;&#x8129;&#x5FA9;&#x56E0;&#x70BA;&#x9805;&#x76EE;&#x6F14;&#x5316;&#x800C;&#x5C0E;&#x7DFB;&#x7684;&#x4E0D;&#x95A4;&#x908F;&#x8F2F;&#x7684;&#x5931;&#x6557;&#x6E2C;&#x8A66;.</p>
<p>&#x5982;&#x679C;&#x4E00;&#x500B;&#x61C9;&#x7528;&#x7A0B;&#x5E8F;&#x5C0D;&#x65BC;&#x65B0;&#x9F63;&#x73FE;&#x7684;&#x4F46;&#x6709;&#x6548;&#x7684;&#x8F38;&#x5165;&#x7D93;&#x5E38;&#x5931;&#x6557;&#x8AAC;&#x660E;&#x7A0B;&#x5E8F;&#x4E0D;&#x5920;&#x7A69;&#x5065;; &#x540C;&#x6A23;&#x5982;&#x679C;&#x4E00;&#x500B;&#x6E2C;&#x8A66;&#x50C5;&#x50C5;&#x56E0;&#x7232;&#x8072;&#x97F3;&#x8B8A;&#x5316;&#x5C31;&#x6703;&#x5C0E;&#x81F4;&#x5931;&#x6557;&#x4E5F;&#x662F;&#x4E0D;&#x5408;&#x908F;&#x8F2F;&#x7684;. &#x5C31;&#x50CF;&#x4E00;&#x500B;&#x4E0D;&#x5920;&#x7A69;&#x5065;&#x7684;&#x7A0B;&#x5E8F;&#x6703;&#x632B;&#x6557;&#x5B83;&#x7684;&#x7528;&#x6236;&#x4E00;&#x6A23;, &#x4E00;&#x500B;&#x8106;&#x5F31;&#x6027;&#x6E2C;&#x8A66;&#x540C;&#x6A23;&#x6703;&#x6FC0;&#x6012;&#x5B83;&#x7684;&#x7DAD;&#x8B77;&#x8005;. &#x6700;&#x8106;&#x5F31;&#x7684;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x6703;&#x5728;&#x7A0B;&#x5E8F;&#x6C92;&#x6709;&#x4EFB;&#x4F55;&#x8B8A;&#x5316;&#x7684;&#x6642;&#x5019;&#x7523;&#x751F;&#x4E0D;&#x540C;&#x7684;&#x7D50;&#x679C;, &#x6642;&#x597D;&#x6642;&#x58DE;, &#x8655;&#x7406;&#x5B83;&#x5011;&#x6703;&#x8017;&#x8CBB;&#x5927;&#x91CF;&#x7684;&#x6642;&#x9593;&#x4F46;&#x662F;&#x4F75;&#x4E0D;&#x6703;&#x5F97;&#x5230;&#x4EFB;&#x4F55;&#x597D;&#x8655;.</p>
<p>&#x7576;&#x4E00;&#x500B;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x7523;&#x751F;&#x4E00;&#x500B;&#x8907;&#x96DC;&#x7684;&#x8F38;&#x9F63;&#x5982;&#x4E00;&#x500B;&#x5F88;&#x9577;&#x7684;&#x5B57;&#x7B26;&#x4E32;, &#x6216;&#x4E00;&#x500B;&#x7CBE;&#x5FC3;&#x8A2D;&#x8A08;&#x7684;&#x6578;&#x64DA;&#x7D50;&#x69CB;, &#x6216;&#x4E00;&#x500B;&#x6587;&#x4EF6;, &#x5B83;&#x53EF;&#x4EE5;&#x7528;&#x65BC;&#x548C;&#x9810;&#x8A2D;&#x7684;&#x2018;&#x2018;golden&#x2019;&#x2019;&#x7D50;&#x679C;&#x6578;&#x64DA;&#x5C0D;&#x6BD4;, &#x7528;&#x9019;&#x7A2E;&#x7C21;&#x55AE;&#x65B9;&#x5F0F;&#x5BEB;&#x6E2C;&#x8A66;&#x662F;&#x8A98;&#x4EBA;&#x7684;. &#x4F46;&#x662F;&#x96A8;&#x7740;&#x9805;&#x76EE;&#x7684;&#x767C;&#x5C55;, &#x8F38;&#x9F63;&#x7684;&#x67D0;&#x4E9B;&#x90E8;&#x5206;&#x5F88;&#x53EF;&#x80FD;&#x6703;&#x767C;&#x751F;&#x8B8A;&#x5316;, &#x76E1;&#x7BA1;&#x5F88;&#x53EF;&#x80FD;&#x662F;&#x4E00;&#x500B;&#x6539;&#x9032;&#x7684;&#x5BE6;&#x73FE;&#x5C0E;&#x81F4;&#x7684;. &#x800C;&#x4E14;&#x4E0D;&#x50C5;&#x50C5;&#x662F;&#x8F38;&#x9F63;&#x90E8;&#x5206;, &#x51FD;&#x6578;&#x8907;&#x96DC;&#x8907;&#x88FD;&#x7684;&#x8F38;&#x5165;&#x90E8;&#x5206;&#x53EF;&#x80FD;&#x4E5F;&#x8DDF;&#x7740;&#x8B8A;&#x5316;&#x4E86;, &#x56E0;&#x6B64;&#x6E2C;&#x8A66;&#x4F7F;&#x7528;&#x7684;&#x8F38;&#x5165;&#x4E5F;&#x5C31;&#x4E0D;&#x5728;&#x6709;&#x6548;&#x4E86;.</p>
<p>&#x907F;&#x514D;&#x8106;&#x5F31;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x7684;&#x65B9;&#x6CD5;&#x662F;&#x96BB;&#x6AA2;&#x6E2C;&#x4F60;&#x771E;&#x6B63;&#x95DC;&#x5FC3;&#x7684;&#x5C6C;&#x6027;. &#x4FDD;&#x5B58;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x7684;&#x7C21;&#x6F54;&#x548C;&#x5167;&#x90E8;&#x7D50;&#x69CB;&#x7684;&#x7A69;&#x5B9A;. &#x7279;&#x522B;&#x662F;&#x5C0D;&#x65B7;&#x8A00;&#x90E8;&#x5206;&#x8981;&#x6709;&#x6240;&#x9078;&#x64C7;. &#x4E0D;&#x8981;&#x6AA2;&#x67FB;&#x5B57;&#x7B26;&#x4E32;&#x7684;&#x5168;&#x5339;&#x914D;, &#x4F46;&#x662F;&#x5C0B;&#x627E;&#x76F8;&#x95DC;&#x7684;&#x5B50;&#x5B57;&#x7B26;&#x4E32;, &#x56E0;&#x7232;&#x67D0;&#x4E9B;&#x5B50;&#x5B57;&#x7B26;&#x4E32;&#x5728;&#x9805;&#x76EE;&#x7684;&#x767C;&#x5C55;&#x4E2D;&#x662F;&#x6BD4;&#x8F03;&#x7A69;&#x5B9A;&#x4E0D;&#x8B8A;&#x7684;. &#x901A;&#x5E38;&#x7DE8;&#x5BEB;&#x4E00;&#x500B;&#x91CD;&#x8907;&#x96DC;&#x7684;&#x8F38;&#x9F63;&#x4E2D;&#x63D0;&#x53D6;&#x5FC5;&#x8981;&#x7CBE;&#x83EF;&#x4FE1;&#x606F;&#x4EE5;&#x7528;&#x65BC;&#x65B7;&#x8A00;&#x662F;&#x503C;&#x5F97;&#x7684;, &#x96D6;&#x7136;&#x9019;&#x53EF;&#x80FD;&#x6703;&#x5E36;&#x4F86;&#x5F88;&#x591A;&#x524D;&#x671F;&#x7684;&#x5DE5;&#x4F5C;, &#x4F46;&#x662F;&#x5B83;&#x53EF;&#x4EE5;&#x5E6B;&#x52A9;&#x8FC5;&#x901F;&#x53CA;&#x6642;&#x8129;&#x8907;&#x56E0;&#x7232;&#x9805;&#x76EE;&#x6F14;&#x5316;&#x800C;&#x5C0E;&#x81F4;&#x7684;&#x4E0D;&#x5408;&#x908F;&#x8F2F;&#x7684;&#x5931;&#x6557;&#x6E2C;&#x8A66;.</p>
</section>

View File

@@ -48,7 +48,7 @@
<body>
<div class="book" data-level="11.3" data-chapter-title="測試覆蓋率" data-filepath="ch11/ch11-03.md" data-basepath=".." data-revision="Wed Dec 16 2015 10:54:29 GMT+0800 (中国标准时间)">
<div class="book" data-level="11.3" data-chapter-title="測試覆蓋率" data-filepath="ch11/ch11-03.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,11 +2024,11 @@
<section class="normal" id="section-">
<h2 id="113-&#x6E2C;&#x8A66;&#x8986;&#x84CB;&#x7387;">11.3. &#x6E2C;&#x8A66;&#x8986;&#x84CB;&#x7387;</h2>
<p>&#x5C31;&#x5176;&#x6027;&#x8CEA;&#x800C;&#x8A00;, &#x6E2C;&#x8A66;&#x4E0D;&#x53EF;&#x80FD;&#x662F;&#x5B8C;&#x6574;&#x7684;. &#x8A08;&#x7B97;&#x6A5F;&#x79D1;&#x5B78;&#x50A2; Edsger Dijkstra &#x66FE;&#x8AAC;&#x904E;: &quot;&#x6E2C;&#x8A66;&#x53EF;&#x4EE5;&#x986F;&#x793A;&#x5B58;&#x5728;&#x7F3A;&#x9677;, &#x4F46;&#x662F;&#x4F75;&#x4E0D;&#x662F;&#x8AAC;&#x6C92;&#x6709;BUG.&quot; &#x518D;&#x591A;&#x7684;&#x6E2C;&#x8A66;&#x4E5F;&#x4E0D;&#x80FD;&#x8B49;&#x660E;&#x4E00;&#x500B;&#x5305;&#x6C92;&#x6709;BUG. &#x5728;&#x6700;&#x597D;&#x7684;&#x60C5;&#x6CC1;&#x4E0B;, &#x6E2C;&#x8A66;&#x53EF;&#x4EE5;&#x589E;&#x5F37;&#x6211;&#x5011;&#x7684;&#x4FE1;&#x606F;, &#x5305;&#x5728;&#x6211;&#x5011;&#x6E2C;&#x8A66;&#x7684;&#x74B0;&#x5883;&#x662F;&#x53EF;&#x4EE5;&#x6B63;&#x5E38;&#x5DE5;&#x4F5C;&#x7684;.</p>
<p>&#x7531;&#x6E2C;&#x8A66;&#x9A45;&#x52D5;&#x89F8;&#x767C;&#x904B;&#x884C;&#x5230;&#x7684;&#x88AB;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x7684;&#x4EE3;&#x78BC;&#x6578;&#x76EE;&#x7A31;&#x7232;&#x6E2C;&#x8A66;&#x7684;&#x8986;&#x84CB;&#x7387;. &#x6E2C;&#x8A66;&#x8986;&#x84CB;&#x7387;&#x4F75;&#x4E0D;&#x80FD;&#x91CF;&#x5316; &#x2014; &#x751A;&#x81F3;&#x9023;&#x6700;&#x7C21;&#x55AE;&#x7684;&#x52D5;&#x614B;&#x7A0B;&#x5E8F;&#x4E5F;&#x96E3;&#x4EE5;&#x7CBE;&#x78BA;&#x6E2C;&#x91CF; &#x2014; &#x4F46;&#x662F;&#x53EF;&#x4EE5;&#x5553;&#x767C;&#x4F75;&#x5E6B;&#x52A9;&#x6211;&#x5011;&#x7DE8;&#x5BEB;&#x7684;&#x6709;&#x6548;&#x7684;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;.</p>
<p>&#x9019;&#x4E9B;&#x5E6B;&#x52A9;&#x4FE1;&#x606F;&#x4E2D;&#x8A9E;&#x53E5;&#x7684;&#x8986;&#x84CB;&#x7387;&#x662F;&#x6700;&#x7C21;&#x55AE;&#x548C;&#x6700;&#x5EE3;&#x6C4E;&#x4F7F;&#x7528;&#x7684;. &#x8A9E;&#x53E5;&#x7684;&#x8986;&#x84CB;&#x7387;&#x662F;&#x6307;&#x5728;&#x6E2C;&#x8A66;&#x4E2D;&#x81F3;&#x5C11;&#x88AB;&#x904B;&#x884C;&#x4E00;&#x6B21;&#x7684;&#x4EE3;&#x78BC;&#x4F54;&#x7E3D;&#x4EE3;&#x78BC;&#x6578;&#x7684;&#x6BD4;&#x4F8B;. &#x5728;&#x672C;&#x7BC0;&#x4E2D;, &#x6211;&#x5011;&#x4F7F;&#x7528; <code>go test</code> &#x4E2D;&#x96C6;&#x6210;&#x7684;&#x6E2C;&#x8A66;&#x8986;&#x84CB;&#x7387;&#x5DE5;&#x5177;, &#x4F86;&#x5EA6;&#x91CF;&#x4E0B;&#x9EAB;&#x4EE3;&#x78BC;&#x7684;&#x6E2C;&#x8A66;&#x8986;&#x84CB;&#x7387;, &#x5E6B;&#x52A9;&#x6211;&#x5011;&#x8B58;&#x5F46;&#x6E2C;&#x8A66;&#x548C;&#x6211;&#x5011;&#x671F;&#x671B;&#x9593;&#x7684;&#x5DEE;&#x8DDD;.</p>
<p>&#x5C31;&#x5176;&#x6027;&#x8CEA;&#x800C;&#x8A00;, &#x6E2C;&#x8A66;&#x4E0D;&#x53EF;&#x80FD;&#x662F;&#x5B8C;&#x6574;&#x7684;. &#x8A08;&#x7B97;&#x6A5F;&#x79D1;&#x5B78;&#x5BB6; Edsger Dijkstra &#x66FE;&#x8AAC;&#x904E;: &quot;&#x6E2C;&#x8A66;&#x53EF;&#x4EE5;&#x986F;&#x793A;&#x5B58;&#x5728;&#x7F3A;&#x9677;, &#x4F46;&#x662F;&#x4F75;&#x4E0D;&#x662F;&#x8AAC;&#x6C92;&#x6709;BUG.&quot; &#x518D;&#x591A;&#x7684;&#x6E2C;&#x8A66;&#x4E5F;&#x4E0D;&#x80FD;&#x8B49;&#x660E;&#x4E00;&#x500B;&#x5305;&#x6C92;&#x6709;BUG. &#x5728;&#x6700;&#x597D;&#x7684;&#x60C5;&#x6CC1;&#x4E0B;, &#x6E2C;&#x8A66;&#x53EF;&#x4EE5;&#x589E;&#x5F37;&#x6211;&#x5011;&#x7684;&#x4FE1;&#x606F;, &#x5305;&#x5728;&#x6211;&#x5011;&#x6E2C;&#x8A66;&#x7684;&#x74B0;&#x5883;&#x662F;&#x53EF;&#x4EE5;&#x6B63;&#x5E38;&#x5DE5;&#x4F5C;&#x7684;.</p>
<p>&#x7531;&#x6E2C;&#x8A66;&#x9A45;&#x52D5;&#x89F8;&#x767C;&#x904B;&#x884C;&#x5230;&#x7684;&#x88AB;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x7684;&#x4EE3;&#x78BC;&#x6578;&#x76EE;&#x7A31;&#x7232;&#x6E2C;&#x8A66;&#x7684;&#x8986;&#x84CB;&#x7387;. &#x6E2C;&#x8A66;&#x8986;&#x84CB;&#x7387;&#x4F75;&#x4E0D;&#x80FD;&#x91CF;&#x5316; &#x2014; &#x751A;&#x81F3;&#x9023;&#x6700;&#x7C21;&#x55AE;&#x7684;&#x52D5;&#x614B;&#x7A0B;&#x5E8F;&#x4E5F;&#x96E3;&#x4EE5;&#x7CBE;&#x78BA;&#x6E2C;&#x91CF; &#x2014; &#x4F46;&#x662F;&#x53EF;&#x4EE5;&#x555F;&#x767C;&#x4F75;&#x5E6B;&#x52A9;&#x6211;&#x5011;&#x7DE8;&#x5BEB;&#x7684;&#x6709;&#x6548;&#x7684;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;.</p>
<p>&#x9019;&#x4E9B;&#x5E6B;&#x52A9;&#x4FE1;&#x606F;&#x4E2D;&#x8A9E;&#x53E5;&#x7684;&#x8986;&#x84CB;&#x7387;&#x662F;&#x6700;&#x7C21;&#x55AE;&#x548C;&#x6700;&#x5EE3;&#x6CDB;&#x4F7F;&#x7528;&#x7684;. &#x8A9E;&#x53E5;&#x7684;&#x8986;&#x84CB;&#x7387;&#x662F;&#x6307;&#x5728;&#x6E2C;&#x8A66;&#x4E2D;&#x81F3;&#x5C11;&#x88AB;&#x904B;&#x884C;&#x4E00;&#x6B21;&#x7684;&#x4EE3;&#x78BC;&#x5360;&#x7E3D;&#x4EE3;&#x78BC;&#x6578;&#x7684;&#x6BD4;&#x4F8B;. &#x5728;&#x672C;&#x7BC0;&#x4E2D;, &#x6211;&#x5011;&#x4F7F;&#x7528; <code>go test</code> &#x4E2D;&#x96C6;&#x6210;&#x7684;&#x6E2C;&#x8A66;&#x8986;&#x84CB;&#x7387;&#x5DE5;&#x5177;, &#x4F86;&#x5EA6;&#x91CF;&#x4E0B;&#x9762;&#x4EE3;&#x78BC;&#x7684;&#x6E2C;&#x8A66;&#x8986;&#x84CB;&#x7387;, &#x5E6B;&#x52A9;&#x6211;&#x5011;&#x8B58;&#x522B;&#x6E2C;&#x8A66;&#x548C;&#x6211;&#x5011;&#x671F;&#x671B;&#x9593;&#x7684;&#x5DEE;&#x8DDD;.</p>
<p>The code below is a table-driven test for the expression evaluator we built back in Chapter 7:</p>
<p>&#x4E0B;&#x9EAB;&#x7684;&#x4EE3;&#x78BC;&#x662F;&#x4E00;&#x500B;&#x9336;&#x683C;&#x9A45;&#x52D5;&#x7684;&#x6E2C;&#x8A66;, &#x7528;&#x65BC;&#x6E2C;&#x8A66;&#x7B2C;&#x4E03;&#x7AE0;&#x7684;&#x9336;&#x9054;&#x5F0F;&#x6C42;&#x503C;&#x7A0B;&#x5E8F;:</p>
<p>&#x4E0B;&#x9762;&#x7684;&#x4EE3;&#x78BC;&#x662F;&#x4E00;&#x500B;&#x8868;&#x683C;&#x9A45;&#x52D5;&#x7684;&#x6E2C;&#x8A66;, &#x7528;&#x65BC;&#x6E2C;&#x8A66;&#x7B2C;&#x4E03;&#x7AE0;&#x7684;&#x8868;&#x9054;&#x5F0F;&#x6C42;&#x503C;&#x7A0B;&#x5E8F;:</p>
<pre><code class="lang-Go">gopl.io/ch7/eval
<span class="hljs-keyword">func</span> TestCoverage(t *testing.T) {
@@ -2107,7 +2071,7 @@
--- PASS: TestCoverage (0.00s)
PASS
ok gopl.io/ch7/eval 0.011s
</code></pre><p>&#x4E0B;&#x9EAB;&#x9019;&#x500B;&#x547D;&#x4EE4;&#x53EF;&#x4EE5;&#x986F;&#x793A;&#x6E2C;&#x8A66;&#x8986;&#x84CB;&#x7387;&#x5DE5;&#x5177;&#x7684;&#x7528;&#x6CD5;&#x4FE1;&#x606F;:</p>
</code></pre><p>&#x4E0B;&#x9762;&#x9019;&#x500B;&#x547D;&#x4EE4;&#x53EF;&#x4EE5;&#x986F;&#x793A;&#x6E2C;&#x8A66;&#x8986;&#x84CB;&#x7387;&#x5DE5;&#x5177;&#x7684;&#x7528;&#x6CD5;&#x4FE1;&#x606F;:</p>
<pre><code>$ go tool cover
Usage of &apos;go tool cover&apos;:
Given a coverage profile produced by &apos;go test&apos;:
@@ -2116,19 +2080,19 @@ Given a coverage profile produced by &apos;go test&apos;:
Open a web browser displaying annotated source code:
go tool cover -html=c.out
...
</code></pre><p><code>go tool</code> &#x547D;&#x4EE4;&#x904B;&#x884C;Go&#x5DE5;&#x5177;&#x93C8;&#x7684;&#x5E95;&#x5C64;&#x53EF;&#x57F7;&#x884C;&#x7A0B;&#x5E8F;. &#x9019;&#x4E9B;&#x5E95;&#x5C64;&#x53EF;&#x57F7;&#x884C;&#x7A0B;&#x5E8F;&#x653E;&#x5728; $GOROOT/pkg/tool/${GOOS}_${GOARCH} &#x76EE;&#x5F54;. &#x56E0;&#x7232; <code>go build</code> &#x7684;&#x539F;&#x56E0;, &#x6211;&#x5011;&#x5F88;&#x5C0F;&#x76F4;&#x63A5;&#x8ABF;&#x7528;&#x9019;&#x4E9B;&#x5E95;&#x5C64;&#x5DE5;&#x5177;.</p>
<p>&#x73FE;&#x5728;&#x6211;&#x5011;&#x53EF;&#x4EE5;&#x7528; <code>-coverprofile</code> &#x6A19;&#x8A8C;&#x8518;&#x6578;&#x91CD;&#x65B0;&#x904B;&#x884C;:</p>
</code></pre><p><code>go tool</code> &#x547D;&#x4EE4;&#x904B;&#x884C;Go&#x5DE5;&#x5177;&#x93C8;&#x7684;&#x5E95;&#x5C64;&#x53EF;&#x57F7;&#x884C;&#x7A0B;&#x5E8F;. &#x9019;&#x4E9B;&#x5E95;&#x5C64;&#x53EF;&#x57F7;&#x884C;&#x7A0B;&#x5E8F;&#x653E;&#x5728; $GOROOT/pkg/tool/${GOOS}_${GOARCH} &#x76EE;&#x9332;. &#x56E0;&#x7232; <code>go build</code> &#x7684;&#x539F;&#x56E0;, &#x6211;&#x5011;&#x5F88;&#x5C0F;&#x76F4;&#x63A5;&#x8ABF;&#x7528;&#x9019;&#x4E9B;&#x5E95;&#x5C64;&#x5DE5;&#x5177;.</p>
<p>&#x73FE;&#x5728;&#x6211;&#x5011;&#x53EF;&#x4EE5;&#x7528; <code>-coverprofile</code> &#x6A19;&#x8A8C;&#x53C3;&#x6578;&#x91CD;&#x65B0;&#x904B;&#x884C;:</p>
<pre><code>$ go test -run=Coverage -coverprofile=c.out gopl.io/ch7/eval
ok gopl.io/ch7/eval 0.032s coverage: 68.5% of statements
</code></pre><p>&#x9019;&#x500B;&#x6A19;&#x8A8C;&#x8518;&#x6578;&#x901A;&#x904E;&#x63D2;&#x5165;&#x751F;&#x6210;&#x9264;&#x5B50;&#x4EE3;&#x78BC;&#x4F86;&#x7D71;&#x8A08;&#x8986;&#x84CB;&#x7387;&#x6578;&#x64DA;. &#x4E5F;&#x5C31;&#x662F;&#x8AAC;, &#x5728;&#x904B;&#x884C;&#x6BCF;&#x500B;&#x6E2C;&#x8A66;&#x524D;, &#x5B83;&#x6703;&#x8129;&#x6539;&#x8981;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x7684;&#x526F;&#x672C;, &#x5728;&#x6BCF;&#x500B;&#x584A;&#x90FD;&#x6703;&#x8A2D;&#x7F6E;&#x4E00;&#x500B;&#x4F48;&#x723E;&#x6A19;&#x8A8C;&#x8B8A;&#x91CF;. &#x5679;&#x88AB;&#x8129;&#x6539;&#x5F8C;&#x7684;&#x88AB;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x904B;&#x884C;&#x9000;&#x9F63;&#x6642;, &#x5C07;&#x7D71;&#x8A08;&#x65E5;&#x8A8C;&#x6578;&#x64DA;&#x5BEB;&#x5165; c.out &#x6587;&#x4EF6;, &#x4F75;&#x6253;&#x5370;&#x4E00;&#x90E8;&#x5206;&#x57F7;&#x884C;&#x7684;&#x8A9E;&#x53E5;&#x7684;&#x4E00;&#x500B;&#x7E3D;&#x7D50;. (&#x5982;&#x679C;&#x4F60;&#x9700;&#x8981;&#x7684;&#x662F;&#x6458;&#x8981;,&#x4F7F;&#x7528; <code>go test -cover</code>.)</p>
<p>&#x5982;&#x679C;&#x4F7F;&#x7528;&#x4E86; <code>-covermode=count</code> &#x6A19;&#x8A8C;&#x8518;&#x6578;, &#x90A3;&#x9EBD;&#x5C07;&#x5728;&#x6BCF;&#x500B;&#x4EE3;&#x78BC;&#x584A;&#x63D2;&#x5165;&#x4E00;&#x500B;&#x8A08;&#x6578;&#x5668;&#x800C;&#x4E0D;&#x662F;&#x4F48;&#x723E;&#x6A19;&#x8A8C;&#x91CF;. &#x5728;&#x7D71;&#x8A08;&#x7D50;&#x679C;&#x4E2D;&#x8A18;&#x5F54;&#x4E86;&#x6BCF;&#x500B;&#x584A;&#x7684;&#x57F7;&#x884C;&#x6B21;&#x6578;, &#x9019;&#x53EF;&#x4EE5;&#x7528;&#x65BC;&#x8861;&#x91CF;&#x54EA;&#x4E9B;&#x662F;&#x88AB;&#x983B;&#x7E41;&#x57F7;&#x884C;&#x7684;&#x71B1;&#x9EDE;&#x4EE3;&#x78BC;.</p>
</code></pre><p>&#x9019;&#x500B;&#x6A19;&#x8A8C;&#x53C3;&#x6578;&#x901A;&#x904E;&#x63D2;&#x5165;&#x751F;&#x6210;&#x9264;&#x5B50;&#x4EE3;&#x78BC;&#x4F86;&#x7D71;&#x8A08;&#x8986;&#x84CB;&#x7387;&#x6578;&#x64DA;. &#x4E5F;&#x5C31;&#x662F;&#x8AAC;, &#x5728;&#x904B;&#x884C;&#x6BCF;&#x500B;&#x6E2C;&#x8A66;&#x524D;, &#x5B83;&#x6703;&#x8129;&#x6539;&#x8981;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x7684;&#x526F;&#x672C;, &#x5728;&#x6BCF;&#x500B;&#x584A;&#x90FD;&#x6703;&#x8A2D;&#x7F6E;&#x4E00;&#x500B;&#x5E03;&#x723E;&#x6A19;&#x8A8C;&#x8B8A;&#x91CF;. &#x7576;&#x88AB;&#x8129;&#x6539;&#x5F8C;&#x7684;&#x88AB;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x904B;&#x884C;&#x9000;&#x9F63;&#x6642;, &#x5C07;&#x7D71;&#x8A08;&#x65E5;&#x8A8C;&#x6578;&#x64DA;&#x5BEB;&#x5165; c.out &#x6587;&#x4EF6;, &#x4F75;&#x6253;&#x5370;&#x4E00;&#x90E8;&#x5206;&#x57F7;&#x884C;&#x7684;&#x8A9E;&#x53E5;&#x7684;&#x4E00;&#x500B;&#x7E3D;&#x7D50;. (&#x5982;&#x679C;&#x4F60;&#x9700;&#x8981;&#x7684;&#x662F;&#x6458;&#x8981;,&#x4F7F;&#x7528; <code>go test -cover</code>.)</p>
<p>&#x5982;&#x679C;&#x4F7F;&#x7528;&#x4E86; <code>-covermode=count</code> &#x6A19;&#x8A8C;&#x53C3;&#x6578;, &#x90A3;&#x9EBD;&#x5C07;&#x5728;&#x6BCF;&#x500B;&#x4EE3;&#x78BC;&#x584A;&#x63D2;&#x5165;&#x4E00;&#x500B;&#x8A08;&#x6578;&#x5668;&#x800C;&#x4E0D;&#x662F;&#x5E03;&#x723E;&#x6A19;&#x8A8C;&#x91CF;. &#x5728;&#x7D71;&#x8A08;&#x7D50;&#x679C;&#x4E2D;&#x8A18;&#x9332;&#x4E86;&#x6BCF;&#x500B;&#x584A;&#x7684;&#x57F7;&#x884C;&#x6B21;&#x6578;, &#x9019;&#x53EF;&#x4EE5;&#x7528;&#x65BC;&#x8861;&#x91CF;&#x54EA;&#x4E9B;&#x662F;&#x88AB;&#x983B;&#x7E41;&#x57F7;&#x884C;&#x7684;&#x71B1;&#x9EDE;&#x4EE3;&#x78BC;.</p>
<p>&#x7232;&#x4E86;&#x6536;&#x96C6;&#x6578;&#x64DA;, &#x6211;&#x5011;&#x904B;&#x884C;&#x4E86;&#x6E2C;&#x8A66;&#x8986;&#x84CB;&#x7387;&#x5DE5;&#x5177;, &#x6253;&#x5370;&#x4E86;&#x6E2C;&#x8A66;&#x65E5;&#x8A8C;, &#x751F;&#x6210;&#x4E00;&#x500B;HTML&#x5831;&#x544A;, &#x7136;&#x5F8C;&#x5728;&#x700F;&#x89BD;&#x5668;&#x4E2D;&#x6253;&#x958B;(&#x5716;11.3).</p>
<pre><code>$ go tool cover -html=c.out
</code></pre><p><img src="../images/ch11-03.png" alt=""></p>
<p>&#x7DA0;&#x8272;&#x7684;&#x4EE3;&#x78BC;&#x584A;&#x88AB;&#x6E2C;&#x8A66;&#x8986;&#x84CB;&#x5230;&#x4E86;, &#x7D05;&#x8272;&#x7684;&#x5247;&#x9336;&#x793A;&#x6C92;&#x6709;&#x88AB;&#x8986;&#x84CB;&#x5230;. &#x7232;&#x4E86;&#x6E05;&#x6670;&#x8D77;&#x898B;, &#x6211;&#x5011;&#x5C07;&#x7684;&#x80CC;&#x666F;&#x7D05;&#x8272;&#x6587;&#x672C;&#x7684;&#x80CC;&#x666F;&#x8A2D;&#x7F6E;&#x6210;&#x4E86;&#x9670;&#x5F71;&#x6548;&#x679C;. &#x6211;&#x5011;&#x53EF;&#x4EE5;&#x99AC;&#x4E0A;&#x767C;&#x73FE; unary &#x64CD;&#x4F5C;&#x7684; Eval &#x65B9;&#x6CD5;&#x4F75;&#x6C92;&#x6709;&#x88AB;&#x57F7;&#x884C;&#x5230;. &#x5982;&#x679C;&#x6211;&#x5011;&#x91DD;&#x5C0D;&#x9019;&#x90E8;&#x5206;&#x672A;&#x88AB;&#x8986;&#x84CB;&#x7684;&#x4EE3;&#x78BC;&#x6DFB;&#x52A0;&#x4E0B;&#x9EAB;&#x7684;&#x6E2C;&#x8A66;, &#x7136;&#x5F8C;&#x91CD;&#x65B0;&#x904B;&#x884C;&#x4E0A;&#x9EAB;&#x7684;&#x547D;&#x4EE4;, &#x90A3;&#x9EBD;&#x6211;&#x5011;&#x5C07;&#x6703;&#x770B;&#x5230;&#x90A3;&#x500B;&#x7D05;&#x8272;&#x90E8;&#x5206;&#x7684;&#x4EE3;&#x78BC;&#x4E5F;&#x8B8A;&#x6210;&#x7DA0;&#x8272;&#x4E86;:</p>
<p>&#x7DD1;&#x8272;&#x7684;&#x4EE3;&#x78BC;&#x584A;&#x88AB;&#x6E2C;&#x8A66;&#x8986;&#x84CB;&#x5230;&#x4E86;, &#x7D05;&#x8272;&#x7684;&#x5247;&#x8868;&#x793A;&#x6C92;&#x6709;&#x88AB;&#x8986;&#x84CB;&#x5230;. &#x7232;&#x4E86;&#x6E05;&#x6670;&#x8D77;&#x898B;, &#x6211;&#x5011;&#x5C07;&#x7684;&#x80CC;&#x666F;&#x7D05;&#x8272;&#x6587;&#x672C;&#x7684;&#x80CC;&#x666F;&#x8A2D;&#x7F6E;&#x6210;&#x4E86;&#x9670;&#x5F71;&#x6548;&#x679C;. &#x6211;&#x5011;&#x53EF;&#x4EE5;&#x99AC;&#x4E0A;&#x767C;&#x73FE; unary &#x64CD;&#x4F5C;&#x7684; Eval &#x65B9;&#x6CD5;&#x4F75;&#x6C92;&#x6709;&#x88AB;&#x57F7;&#x884C;&#x5230;. &#x5982;&#x679C;&#x6211;&#x5011;&#x91DD;&#x5C0D;&#x9019;&#x90E8;&#x5206;&#x672A;&#x88AB;&#x8986;&#x84CB;&#x7684;&#x4EE3;&#x78BC;&#x6DFB;&#x52A0;&#x4E0B;&#x9762;&#x7684;&#x6E2C;&#x8A66;, &#x7136;&#x5F8C;&#x91CD;&#x65B0;&#x904B;&#x884C;&#x4E0A;&#x9762;&#x7684;&#x547D;&#x4EE4;, &#x90A3;&#x9EBD;&#x6211;&#x5011;&#x5C07;&#x6703;&#x770B;&#x5230;&#x90A3;&#x500B;&#x7D05;&#x8272;&#x90E8;&#x5206;&#x7684;&#x4EE3;&#x78BC;&#x4E5F;&#x8B8A;&#x6210;&#x7DD1;&#x8272;&#x4E86;:</p>
<pre><code>{&quot;-x * -x&quot;, eval.Env{&quot;x&quot;: 2}, &quot;4&quot;}
</code></pre><p>&#x4E0D;&#x904E;&#x5169;&#x500B; panic &#x8A9E;&#x53E5;&#x4F9D;&#x7136;&#x662F;&#x7D05;&#x8272;&#x7684;. &#x9019;&#x662F;&#x6C92;&#x6709;&#x554F;&#x984C;&#x7684;, &#x56E0;&#x7232;&#x9019;&#x5169;&#x500B;&#x8A9E;&#x53E5;&#x4F75;&#x4E0D;&#x6703;&#x88AB;&#x57F7;&#x884C;&#x5230;.</p>
<p>&#x5BE6;&#x73FE; 100% &#x7684;&#x6E2C;&#x8A66;&#x8986;&#x84CB;&#x7387;&#x807D;&#x8D77;&#x4F86;&#x5F88;&#x597D;, &#x4F46;&#x662F;&#x5728;&#x5177;&#x9AD4;&#x5BE6;&#x8E10;&#x4E2D;&#x901A;&#x5E38;&#x662F;&#x4E0D;&#x53EF;&#x884C;&#x7684;, &#x4E5F;&#x4E0D;&#x662F;&#x503C;&#x5F97;&#x63A8;&#x85A6;&#x7684;&#x505A;&#x6CD5;. &#x56E0;&#x7232;&#x90A3;&#x96BB;&#x80FD;&#x8AAC;&#x660E;&#x4EE3;&#x78BC;&#x88AB;&#x57F7;&#x884C;&#x904E;&#x800C;&#x5DF2;, &#x4F75;&#x4E0D;&#x610F;&#x5473;&#x7740;&#x4EE3;&#x78BC;&#x662F;&#x6C92;&#x6709;BUG&#x7684;; &#x56E0;&#x7232;&#x5C0D;&#x65BC;&#x908F;&#x8F2F;&#x5FA9;&#x96DC;&#x7684;&#x8A9E;&#x53E5;&#x9700;&#x8981;&#x91DD;&#x5C0D;&#x4E0D;&#x8855;&#x7684;&#x8F38;&#x5165;&#x57F7;&#x884C;&#x591A;&#x6B21;. &#x6709;&#x4E00;&#x4E9B;&#x8A9E;&#x53E5;, &#x4F8B;&#x5982;&#x4E0A;&#x9EAB;&#x7684; panic &#x8A9E;&#x53E5;&#x5247;&#x6C38;&#x9060;&#x90FD;&#x4E0D;&#x6703;&#x88AB;&#x57F7;&#x884C;&#x5230;. &#x53E6;&#x5916;, &#x9084;&#x6709;&#x4E00;&#x4E9B;&#x96B1;&#x6666;&#x7684;&#x932F;&#x8AA4;&#x5728;&#x73FE;&#x5BE6;&#x4E2D;&#x5F88;&#x5C11;&#x9047;&#x5230;&#x4E5F;&#x5F88;&#x96E3;&#x7DE8;&#x5BEB;&#x5C0D;&#x61C9;&#x7684;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;. &#x6E2C;&#x8A66;&#x5F9E;&#x672C;&#x8CEA;&#x4E0A;&#x4F86;&#x8AAC;&#x662F;&#x4E00;&#x500B;&#x6BD4;&#x8F03;&#x52D9;&#x5BE6;&#x7684;&#x5DE5;&#x4F5C;, &#x7DE8;&#x5BEB;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x548C;&#x7DE8;&#x5BEB;&#x61C9;&#x7528;&#x4EE3;&#x78BC;&#x7684;&#x6210;&#x672C;&#x5C0D;&#x6BD4;&#x662F;&#x9700;&#x8981;&#x8003;&#x616E;&#x7684;. &#x6E2C;&#x8A66;&#x8986;&#x84CB;&#x7387;&#x5DE5;&#x5177;&#x53EF;&#x4EE5;&#x5E6B;&#x52A9;&#x6211;&#x5011;&#x5FEB;&#x901F;&#x8B58;&#x5F46;&#x6E2C;&#x8A66;&#x8584;&#x5F31;&#x7684;&#x5730;&#x65B9;, &#x4F46;&#x662F;&#x8A2D;&#x8A08;&#x597D;&#x7684;&#x6E2C;&#x8A66;&#x7528;&#x4F8B;&#x548C;&#x7DE8;&#x5BEB;&#x61C9;&#x7528;&#x4EE3;&#x78BC;&#x4E00;&#x6A23;&#x9700;&#x8981;&#x56B4;&#x5BC6;&#x7684;&#x601D;&#x8003;.</p>
<p>&#x5BE6;&#x73FE; 100% &#x7684;&#x6E2C;&#x8A66;&#x8986;&#x84CB;&#x7387;&#x807D;&#x8D77;&#x4F86;&#x5F88;&#x597D;, &#x4F46;&#x662F;&#x5728;&#x5177;&#x9AD4;&#x5BE6;&#x8E10;&#x4E2D;&#x901A;&#x5E38;&#x662F;&#x4E0D;&#x53EF;&#x884C;&#x7684;, &#x4E5F;&#x4E0D;&#x662F;&#x503C;&#x5F97;&#x63A8;&#x85A6;&#x7684;&#x505A;&#x6CD5;. &#x56E0;&#x7232;&#x90A3;&#x96BB;&#x80FD;&#x8AAC;&#x660E;&#x4EE3;&#x78BC;&#x88AB;&#x57F7;&#x884C;&#x904E;&#x800C;&#x5DF2;, &#x4F75;&#x4E0D;&#x610F;&#x5473;&#x7740;&#x4EE3;&#x78BC;&#x662F;&#x6C92;&#x6709;BUG&#x7684;; &#x56E0;&#x7232;&#x5C0D;&#x65BC;&#x908F;&#x8F2F;&#x8907;&#x96DC;&#x7684;&#x8A9E;&#x53E5;&#x9700;&#x8981;&#x91DD;&#x5C0D;&#x4E0D;&#x540C;&#x7684;&#x8F38;&#x5165;&#x57F7;&#x884C;&#x591A;&#x6B21;. &#x6709;&#x4E00;&#x4E9B;&#x8A9E;&#x53E5;, &#x4F8B;&#x5982;&#x4E0A;&#x9762;&#x7684; panic &#x8A9E;&#x53E5;&#x5247;&#x6C38;&#x9060;&#x90FD;&#x4E0D;&#x6703;&#x88AB;&#x57F7;&#x884C;&#x5230;. &#x53E6;&#x5916;, &#x9084;&#x6709;&#x4E00;&#x4E9B;&#x96B1;&#x6666;&#x7684;&#x932F;&#x8AA4;&#x5728;&#x73FE;&#x5BE6;&#x4E2D;&#x5F88;&#x5C11;&#x9047;&#x5230;&#x4E5F;&#x5F88;&#x96E3;&#x7DE8;&#x5BEB;&#x5C0D;&#x61C9;&#x7684;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;. &#x6E2C;&#x8A66;&#x5F9E;&#x672C;&#x8CEA;&#x4E0A;&#x4F86;&#x8AAC;&#x662F;&#x4E00;&#x500B;&#x6BD4;&#x8F03;&#x52D9;&#x5BE6;&#x7684;&#x5DE5;&#x4F5C;, &#x7DE8;&#x5BEB;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x548C;&#x7DE8;&#x5BEB;&#x61C9;&#x7528;&#x4EE3;&#x78BC;&#x7684;&#x6210;&#x672C;&#x5C0D;&#x6BD4;&#x662F;&#x9700;&#x8981;&#x8003;&#x616E;&#x7684;. &#x6E2C;&#x8A66;&#x8986;&#x84CB;&#x7387;&#x5DE5;&#x5177;&#x53EF;&#x4EE5;&#x5E6B;&#x52A9;&#x6211;&#x5011;&#x5FEB;&#x901F;&#x8B58;&#x522B;&#x6E2C;&#x8A66;&#x8584;&#x5F31;&#x7684;&#x5730;&#x65B9;, &#x4F46;&#x662F;&#x8A2D;&#x8A08;&#x597D;&#x7684;&#x6E2C;&#x8A66;&#x7528;&#x4F8B;&#x548C;&#x7DE8;&#x5BEB;&#x61C9;&#x7528;&#x4EE3;&#x78BC;&#x4E00;&#x6A23;&#x9700;&#x8981;&#x56B4;&#x5BC6;&#x7684;&#x601D;&#x8003;.</p>
</section>

View File

@@ -48,7 +48,7 @@
<body>
<div class="book" data-level="11.4" data-chapter-title="基準測試" data-filepath="ch11/ch11-04.md" data-basepath=".." data-revision="Wed Dec 16 2015 10:54:29 GMT+0800 (中国标准时间)">
<div class="book" data-level="11.4" data-chapter-title="基準測試" data-filepath="ch11/ch11-04.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,8 +2024,8 @@
<section class="normal" id="section-">
<h2 id="114-&#x57FA;&#x6E96;&#x6E2C;&#x8A66;">11.4. &#x57FA;&#x6E96;&#x6E2C;&#x8A66;</h2>
<p>&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x662F;&#x6E2C;&#x91CF;&#x4E00;&#x7B87;&#x7A0B;&#x5E8F;&#x5728;&#x56FA;&#x5B9A;&#x5DE5;&#x4F5C;&#x8CA0;&#x8F09;&#x4E0B;&#x7684;&#x6027;&#x80FD;. &#x5728;Go&#x8A9E;&#x8A00;&#x4E2D;, &#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x548C;&#x666E;&#x901A;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x985E;&#x4F3C;, &#x4F46;&#x662F;&#x4EE5;Benchmark&#x7232;&#x524D;&#x7DB4;&#x540D;, &#x4F75;&#x4E14;&#x5E36;&#x6709;&#x4E00;&#x7B87; <code>*testing.B</code> &#x985E;&#x578B;&#x7684;&#x53C3;&#x6578;; <code>*testing.B</code> &#x9664;&#x4E86;&#x63D0;&#x4F9B;&#x548C; <code>*testing.T</code> &#x985E;&#x4F3C;&#x7684;&#x65B9;&#x6CD5;, &#x9084;&#x6709;&#x984D;&#x5916;&#x4E00;&#x4E9B;&#x548C;&#x6027;&#x80FD;&#x6E2C;&#x91CF;&#x76F8;&#x95DC;&#x7684;&#x65B9;&#x6CD5;. &#x5B83;&#x9084;&#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x7B87;&#x6574;&#x6578;N, &#x7528;&#x65BC;&#x6307;&#x5B9A;&#x64CD;&#x4F5C;&#x57F7;&#x884C;&#x7684;&#x5FAA;&#x74B0;&#x6B21;&#x6578;.</p>
<p>&#x4E0B;&#x9EAB;&#x662F; IsPalindrome &#x51FD;&#x6578;&#x7684;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;, &#x5176;&#x4E2D;&#x5FAA;&#x74B0;&#x5C07;&#x57F7;&#x884C;N&#x6B21;.</p>
<p>&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x662F;&#x6E2C;&#x91CF;&#x4E00;&#x500B;&#x7A0B;&#x5E8F;&#x5728;&#x56FA;&#x5B9A;&#x5DE5;&#x4F5C;&#x8CA0;&#x8F09;&#x4E0B;&#x7684;&#x6027;&#x80FD;. &#x5728;Go&#x8A9E;&#x8A00;&#x4E2D;, &#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x548C;&#x666E;&#x901A;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x985E;&#x4F3C;, &#x4F46;&#x662F;&#x4EE5;Benchmark&#x7232;&#x524D;&#x7DB4;&#x540D;, &#x4F75;&#x4E14;&#x5E36;&#x6709;&#x4E00;&#x500B; <code>*testing.B</code> &#x985E;&#x578B;&#x7684;&#x53C3;&#x6578;; <code>*testing.B</code> &#x9664;&#x4E86;&#x63D0;&#x4F9B;&#x548C; <code>*testing.T</code> &#x985E;&#x4F3C;&#x7684;&#x65B9;&#x6CD5;, &#x9084;&#x6709;&#x984D;&#x5916;&#x4E00;&#x4E9B;&#x548C;&#x6027;&#x80FD;&#x6E2C;&#x91CF;&#x76F8;&#x95DC;&#x7684;&#x65B9;&#x6CD5;. &#x5B83;&#x9084;&#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x500B;&#x6574;&#x6578;N, &#x7528;&#x65BC;&#x6307;&#x5B9A;&#x64CD;&#x4F5C;&#x57F7;&#x884C;&#x7684;&#x5FAA;&#x74B0;&#x6B21;&#x6578;.</p>
<p>&#x4E0B;&#x9762;&#x662F; IsPalindrome &#x51FD;&#x6578;&#x7684;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;, &#x5176;&#x4E2D;&#x5FAA;&#x74B0;&#x5C07;&#x57F7;&#x884C;N&#x6B21;.</p>
<pre><code class="lang-Go"><span class="hljs-keyword">import</span> <span class="hljs-string">&quot;testing&quot;</span>
<span class="hljs-keyword">func</span> BenchmarkIsPalindrome(b *testing.B) {
@@ -2070,16 +2034,16 @@
}
}
</code></pre>
<p>&#x6211;&#x5011;&#x7528;&#x4E0B;&#x9EAB;&#x7684;&#x547D;&#x4EE4;&#x904B;&#x884C;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;. &#x548C;&#x666E;&#x901A;&#x6E2C;&#x8A66;&#x4E0D;&#x8855;&#x7684;&#x662F;, &#x9ED8;&#x8A8D;&#x60C5;&#x6CC1;&#x4E0B;&#x4E0D;&#x904B;&#x884C;&#x4EFB;&#x4F55;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;. &#x6211;&#x5011;&#x9700;&#x8981;&#x901A;&#x904E; <code>-bench</code> &#x547D;&#x4EE4;&#x884C;&#x6A19;&#x8A8C;&#x53C3;&#x6578;&#x624B;&#x5DE5;&#x6307;&#x5B9A;&#x8981;&#x904B;&#x884C;&#x7684;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x51FD;&#x6578;. &#x8A72;&#x53C3;&#x6578;&#x662F;&#x4E00;&#x7B87;&#x6B63;&#x5247;&#x9336;&#x9054;&#x5F0F;, &#x7528;&#x65BC;&#x5339;&#x914D;&#x8981;&#x57F7;&#x884C;&#x7684;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x7684;&#x540D;&#x5B57;, &#x9ED8;&#x8A8D;&#x503C;&#x662F;&#x7A7A;&#x7684;. &#x5176;&#x4E2D; &#x2018;&#x2018;.&#x2019;&#x2019; &#x6A21;&#x5F0F;&#x5C07;&#x53EF;&#x4EE5;&#x5339;&#x914D;&#x6240;&#x6709;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x51FD;&#x6578;, &#x4F46;&#x662F;&#x9019;&#x88E1;&#x7E3D;&#x5171;&#x96BB;&#x6709;&#x4E00;&#x7B87;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x51FD;&#x6578;, &#x56E0;&#x6B64; &#x548C; <code>-bench=IsPalindrome</code> &#x53C3;&#x6578;&#x662F;&#x7B49;&#x50F9;&#x7684;&#x6548;&#x679C;.</p>
<p>&#x6211;&#x5011;&#x7528;&#x4E0B;&#x9762;&#x7684;&#x547D;&#x4EE4;&#x904B;&#x884C;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;. &#x548C;&#x666E;&#x901A;&#x6E2C;&#x8A66;&#x4E0D;&#x540C;&#x7684;&#x662F;, &#x9ED8;&#x8A8D;&#x60C5;&#x6CC1;&#x4E0B;&#x4E0D;&#x904B;&#x884C;&#x4EFB;&#x4F55;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;. &#x6211;&#x5011;&#x9700;&#x8981;&#x901A;&#x904E; <code>-bench</code> &#x547D;&#x4EE4;&#x884C;&#x6A19;&#x8A8C;&#x53C3;&#x6578;&#x624B;&#x5DE5;&#x6307;&#x5B9A;&#x8981;&#x904B;&#x884C;&#x7684;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x51FD;&#x6578;. &#x8A72;&#x53C3;&#x6578;&#x662F;&#x4E00;&#x500B;&#x6B63;&#x5247;&#x8868;&#x9054;&#x5F0F;, &#x7528;&#x65BC;&#x5339;&#x914D;&#x8981;&#x57F7;&#x884C;&#x7684;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x7684;&#x540D;&#x5B57;, &#x9ED8;&#x8A8D;&#x503C;&#x662F;&#x7A7A;&#x7684;. &#x5176;&#x4E2D; &#x2018;&#x2018;.&#x2019;&#x2019; &#x6A21;&#x5F0F;&#x5C07;&#x53EF;&#x4EE5;&#x5339;&#x914D;&#x6240;&#x6709;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x51FD;&#x6578;, &#x4F46;&#x662F;&#x9019;&#x91CC;&#x7E3D;&#x5171;&#x96BB;&#x6709;&#x4E00;&#x500B;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x51FD;&#x6578;, &#x56E0;&#x6B64; &#x548C; <code>-bench=IsPalindrome</code> &#x53C3;&#x6578;&#x662F;&#x7B49;&#x50F9;&#x7684;&#x6548;&#x679C;.</p>
<pre><code>$ cd $GOPATH/src/gopl.io/ch11/word2
$ go test -bench=.
PASS
BenchmarkIsPalindrome-8 1000000 1035 ns/op
ok gopl.io/ch11/word2 2.179s
</code></pre><p>&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x540D;&#x7684;&#x6578;&#x5B57;&#x5F8C;&#x7DB4;&#x90E8;&#x5206;, &#x9019;&#x88E1;&#x662F;8, &#x9336;&#x793A;&#x904B;&#x884C;&#x6642;&#x5C0D;&#x61C9;&#x7684; GOMAXPROCS &#x7684;&#x503C;, &#x9019;&#x5C0D;&#x65BC;&#x4E00;&#x4E9B;&#x548C;&#x4F75;&#x767C;&#x76F8;&#x95DC;&#x7684;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x662F;&#x91CD;&#x8981;&#x7684;&#x4FE1;&#x606F;.</p>
<p>&#x5831;&#x544A;&#x986F;&#x793A;&#x6BCF;&#x6B21;&#x8ABF;&#x7528; IsPalindrome &#x51FD;&#x6578;&#x82B1;&#x8CBB; 1.035&#x5FAE;&#x79D2;, &#x662F;&#x57F7;&#x884C; 1,000,000 &#x6B21;&#x7684;&#x5E73;&#x5747;&#x6642;&#x9593;. &#x56E0;&#x7232;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x9A45;&#x52D5;&#x5668;&#x4F75;&#x4E0D;&#x77E5;&#x9053;&#x6BCF;&#x7B87;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x904B;&#x884C;&#x6240;&#x82B1;&#x7684;&#x6642;&#x5019;, &#x5B83;&#x6703;&#x5617;&#x8A66;&#x5728;&#x771E;&#x6B63;&#x904B;&#x884C;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x524D;&#x5148;&#x5617;&#x8A66;&#x7528;&#x8F03;&#x5C0F;&#x7684; N &#x904B;&#x884C;&#x6E2C;&#x8A66;&#x4F86;&#x4F30;&#x7B97;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x6240;&#x9700;&#x8981;&#x7684;&#x6642;&#x9593;, &#x7136;&#x5F8C;&#x63A8;&#x65B7;&#x4E00;&#x7B87;&#x8F03;&#x5927;&#x7684;&#x6642;&#x9593;&#x4FDD;&#x8A3C;&#x7A69;&#x5B9A;&#x7684;&#x6E2C;&#x91CF;&#x7D50;&#x679C;.</p>
<p>&#x5FAA;&#x74B0;&#x5728;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x5167;&#x5BE6;&#x73FE;, &#x800C;&#x4E0D;&#x662F;&#x653E;&#x5728;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x6846;&#x67B6;&#x5167;&#x5BE6;&#x73FE;, &#x9019;&#x6A23;&#x53EF;&#x4EE5;&#x8B93;&#x6BCF;&#x7B87;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x6709;&#x6A5F;&#x6703;&#x5728;&#x5FAA;&#x74B0;&#x555F;&#x52D5;&#x524D;&#x57F7;&#x884C;&#x521D;&#x59CB;&#x5316;&#x4EE3;&#x78BC;, &#x9019;&#x6A23;&#x4F75;&#x4E0D;&#x6703;&#x986F;&#x8457;&#x5F71;&#x97FF;&#x6BCF;&#x6B21;&#x8FED;&#x4EE3;&#x7684;&#x5E73;&#x5747;&#x904B;&#x884C;&#x6642;&#x9593;. &#x5982;&#x679C;&#x9084;&#x662F;&#x64D4;&#x5FC3;&#x521D;&#x59CB;&#x5316;&#x4EE3;&#x78BC;&#x90E8;&#x5206;&#x5C0D;&#x6E2C;&#x91CF;&#x6642;&#x9593;&#x5E36;&#x4F86;&#x4E7E;&#x64FE;, &#x90A3;&#x9EBC;&#x53EF;&#x4EE5;&#x901A;&#x904E; testing.B &#x53C3;&#x6578;&#x7684;&#x65B9;&#x6CD5;&#x4F86;&#x81E8;&#x6642;&#x95DC;&#x9589;&#x6216;&#x91CD;&#x7F6E;&#x8A08;&#x6642;&#x5668;, &#x4E0D;&#x904E;&#x9019;&#x4E9B;&#x4E00;&#x822C;&#x5F88;&#x5C11;&#x6703;&#x7528;&#x5230;.</p>
<p>&#x73FE;&#x5728;&#x6211;&#x5011;&#x6709;&#x4E86;&#x4E00;&#x7B87;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x548C;&#x666E;&#x901A;&#x6E2C;&#x8A66;, &#x6211;&#x5011;&#x53EF;&#x4EE5;&#x5F88;&#x5BB9;&#x6613;&#x6E2C;&#x8A66;&#x65B0;&#x7684;&#x8B93;&#x7A0B;&#x5E8F;&#x904B;&#x884C;&#x66F4;&#x5FEB;&#x7684;&#x60F3;&#x6CD5;. &#x4E5F;&#x8A31;&#x6700;&#x660E;&#x986F;&#x7684;&#x512A;&#x5316;&#x662F;&#x5728; IsPalindrome &#x51FD;&#x6578;&#x4E2D;&#x7B2C;&#x4E8C;&#x7B87;&#x5FAA;&#x74B0;&#x7684;&#x505C;&#x6B62;&#x6AA2;&#x67FB;, &#x9019;&#x6A23;&#x53EF;&#x4EE5;&#x907F;&#x514D;&#x6BCF;&#x7B87;&#x6BD4;&#x8F03;&#x90FD;&#x505A;&#x5169;&#x6B21;:</p>
</code></pre><p>&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x540D;&#x7684;&#x6578;&#x5B57;&#x5F8C;&#x7DB4;&#x90E8;&#x5206;, &#x9019;&#x91CC;&#x662F;8, &#x8868;&#x793A;&#x904B;&#x884C;&#x6642;&#x5C0D;&#x61C9;&#x7684; GOMAXPROCS &#x7684;&#x503C;, &#x9019;&#x5C0D;&#x65BC;&#x4E00;&#x4E9B;&#x548C;&#x4F75;&#x767C;&#x76F8;&#x95DC;&#x7684;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x662F;&#x91CD;&#x8981;&#x7684;&#x4FE1;&#x606F;.</p>
<p>&#x5831;&#x544A;&#x986F;&#x793A;&#x6BCF;&#x6B21;&#x8ABF;&#x7528; IsPalindrome &#x51FD;&#x6578;&#x82B1;&#x8CBB; 1.035&#x5FAE;&#x79D2;, &#x662F;&#x57F7;&#x884C; 1,000,000 &#x6B21;&#x7684;&#x5E73;&#x5747;&#x6642;&#x9593;. &#x56E0;&#x7232;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x9A45;&#x52D5;&#x5668;&#x4F75;&#x4E0D;&#x77E5;&#x9053;&#x6BCF;&#x500B;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x904B;&#x884C;&#x6240;&#x82B1;&#x7684;&#x6642;&#x5019;, &#x5B83;&#x6703;&#x5690;&#x8A66;&#x5728;&#x771E;&#x6B63;&#x904B;&#x884C;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x524D;&#x5148;&#x5690;&#x8A66;&#x7528;&#x8F03;&#x5C0F;&#x7684; N &#x904B;&#x884C;&#x6E2C;&#x8A66;&#x4F86;&#x4F30;&#x7B97;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x6240;&#x9700;&#x8981;&#x7684;&#x6642;&#x9593;, &#x7136;&#x5F8C;&#x63A8;&#x65B7;&#x4E00;&#x500B;&#x8F03;&#x5927;&#x7684;&#x6642;&#x9593;&#x4FDD;&#x8B49;&#x7A69;&#x5B9A;&#x7684;&#x6E2C;&#x91CF;&#x7D50;&#x679C;.</p>
<p>&#x5FAA;&#x74B0;&#x5728;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x5167;&#x5BE6;&#x73FE;, &#x800C;&#x4E0D;&#x662F;&#x653E;&#x5728;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x6846;&#x67B6;&#x5167;&#x5BE6;&#x73FE;, &#x9019;&#x6A23;&#x53EF;&#x4EE5;&#x8B93;&#x6BCF;&#x500B;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x6709;&#x6A5F;&#x6703;&#x5728;&#x5FAA;&#x74B0;&#x555F;&#x52D5;&#x524D;&#x57F7;&#x884C;&#x521D;&#x59CB;&#x5316;&#x4EE3;&#x78BC;, &#x9019;&#x6A23;&#x4F75;&#x4E0D;&#x6703;&#x986F;&#x8457;&#x5F71;&#x97FF;&#x6BCF;&#x6B21;&#x8FED;&#x4EE3;&#x7684;&#x5E73;&#x5747;&#x904B;&#x884C;&#x6642;&#x9593;. &#x5982;&#x679C;&#x9084;&#x662F;&#x64D4;&#x5FC3;&#x521D;&#x59CB;&#x5316;&#x4EE3;&#x78BC;&#x90E8;&#x5206;&#x5C0D;&#x6E2C;&#x91CF;&#x6642;&#x9593;&#x5E36;&#x4F86;&#x69A6;&#x64FE;, &#x90A3;&#x9EBD;&#x53EF;&#x4EE5;&#x901A;&#x904E; testing.B &#x53C3;&#x6578;&#x7684;&#x65B9;&#x6CD5;&#x4F86;&#x81E8;&#x6642;&#x95DC;&#x9589;&#x6216;&#x91CD;&#x7F6E;&#x8A08;&#x6642;&#x5668;, &#x4E0D;&#x904E;&#x9019;&#x4E9B;&#x4E00;&#x822C;&#x5F88;&#x5C11;&#x6703;&#x7528;&#x5230;.</p>
<p>&#x73FE;&#x5728;&#x6211;&#x5011;&#x6709;&#x4E86;&#x4E00;&#x500B;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x548C;&#x666E;&#x901A;&#x6E2C;&#x8A66;, &#x6211;&#x5011;&#x53EF;&#x4EE5;&#x5F88;&#x5BB9;&#x6613;&#x6E2C;&#x8A66;&#x65B0;&#x7684;&#x8B93;&#x7A0B;&#x5E8F;&#x904B;&#x884C;&#x66F4;&#x5FEB;&#x7684;&#x60F3;&#x6CD5;. &#x4E5F;&#x8A31;&#x6700;&#x660E;&#x986F;&#x7684;&#x512A;&#x5316;&#x662F;&#x5728; IsPalindrome &#x51FD;&#x6578;&#x4E2D;&#x7B2C;&#x4E8C;&#x500B;&#x5FAA;&#x74B0;&#x7684;&#x505C;&#x6B62;&#x6AA2;&#x67FB;, &#x9019;&#x6A23;&#x53EF;&#x4EE5;&#x907F;&#x514D;&#x6BCF;&#x500B;&#x6BD4;&#x8F03;&#x90FD;&#x505A;&#x5169;&#x6B21;:</p>
<pre><code class="lang-Go">n := <span class="hljs-built_in">len</span>(letters)/<span class="hljs-number">2</span>
<span class="hljs-keyword">for</span> i := <span class="hljs-number">0</span>; i &lt; n; i++ {
<span class="hljs-keyword">if</span> letters[i] != letters[<span class="hljs-built_in">len</span>(letters)-<span class="hljs-number">1</span>-i] {
@@ -2088,12 +2052,12 @@ ok gopl.io/ch11/word2 2.179s
}
<span class="hljs-keyword">return</span> <span class="hljs-constant">true</span>
</code></pre>
<p>&#x4E0D;&#x904E;&#x5F88;&#x591A;&#x60C5;&#x6CC1;&#x4E0B;, &#x4E00;&#x7B87;&#x660E;&#x986F;&#x7684;&#x512A;&#x5316;&#x4F75;&#x4E0D;&#x4E00;&#x5B9A;&#x5C31;&#x80FD;&#x4EE3;&#x78BC;&#x9810;&#x671F;&#x7684;&#x6548;&#x679C;. &#x9019;&#x7B87;&#x6539;&#x9032;&#x5728;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x4E2D;&#x503C;&#x5E36;&#x4F86;&#x4E86; 4% &#x7684;&#x6027;&#x80FD;&#x63D0;&#x6607;.</p>
<p>&#x4E0D;&#x904E;&#x5F88;&#x591A;&#x60C5;&#x6CC1;&#x4E0B;, &#x4E00;&#x500B;&#x660E;&#x986F;&#x7684;&#x512A;&#x5316;&#x4F75;&#x4E0D;&#x4E00;&#x5B9A;&#x5C31;&#x80FD;&#x4EE3;&#x78BC;&#x9810;&#x671F;&#x7684;&#x6548;&#x679C;. &#x9019;&#x500B;&#x6539;&#x9032;&#x5728;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x4E2D;&#x503C;&#x5E36;&#x4F86;&#x4E86; 4% &#x7684;&#x6027;&#x80FD;&#x63D0;&#x965E;.</p>
<pre><code>$ go test -bench=.
PASS
BenchmarkIsPalindrome-8 1000000 992 ns/op
ok gopl.io/ch11/word2 2.093s
</code></pre><p>&#x53E6;&#x4E00;&#x7B87;&#x6539;&#x9032;&#x60F3;&#x6CD5;&#x662F;&#x5728;&#x958B;&#x59CB;&#x7232;&#x6BCF;&#x7B87;&#x5B57;&#x7B26;&#x9810;&#x5148;&#x5206;&#x914D;&#x4E00;&#x7B87;&#x8DB3;&#x5920;&#x5927;&#x7684;&#x6578;&#x7D44;, &#x9019;&#x6A23;&#x5C31;&#x53EF;&#x4EE5;&#x907F;&#x514D;&#x5728; append &#x8ABF;&#x7528;&#x6642;&#x53EF;&#x80FD;&#x6703;&#x5C0E;&#x7DFB;&#x5167;&#x5B58;&#x7684;&#x591A;&#x6B21;&#x91CD;&#x65B0;&#x5206;&#x914D;. &#x8072;&#x660E;&#x4E00;&#x7B87; letters &#x6578;&#x7D44;&#x8B8A;&#x91CF;, &#x4F75;&#x6307;&#x5B9A;&#x95A4;&#x9069;&#x7684;&#x5927;&#x5C0F;, &#x50CF;&#x9019;&#x6A23;,</p>
</code></pre><p>&#x53E6;&#x4E00;&#x500B;&#x6539;&#x9032;&#x60F3;&#x6CD5;&#x662F;&#x5728;&#x958B;&#x59CB;&#x7232;&#x6BCF;&#x500B;&#x5B57;&#x7B26;&#x9810;&#x5148;&#x5206;&#x914D;&#x4E00;&#x500B;&#x8DB3;&#x5920;&#x5927;&#x7684;&#x6578;&#x7D44;, &#x9019;&#x6A23;&#x5C31;&#x53EF;&#x4EE5;&#x907F;&#x514D;&#x5728; append &#x8ABF;&#x7528;&#x6642;&#x53EF;&#x80FD;&#x6703;&#x5C0E;&#x81F4;&#x5167;&#x5B58;&#x7684;&#x591A;&#x6B21;&#x91CD;&#x65B0;&#x5206;&#x914D;. &#x8072;&#x660E;&#x4E00;&#x500B; letters &#x6578;&#x7D44;&#x8B8A;&#x91CF;, &#x4F75;&#x6307;&#x5B9A;&#x5408;&#x9069;&#x7684;&#x5927;&#x5C0F;, &#x50CF;&#x9019;&#x6A23;,</p>
<pre><code class="lang-Go">letters := <span class="hljs-built_in">make</span>([]<span class="hljs-typename">rune</span>, <span class="hljs-number">0</span>, <span class="hljs-built_in">len</span>(s))
<span class="hljs-keyword">for</span> _, r := <span class="hljs-keyword">range</span> s {
<span class="hljs-keyword">if</span> unicode.IsLetter(r) {
@@ -2101,12 +2065,12 @@ ok gopl.io/ch11/word2 2.093s
}
}
</code></pre>
<p>&#x9019;&#x7B87;&#x6539;&#x9032;&#x63D0;&#x6607;&#x6027;&#x80FD;&#x7D04; 35%, &#x5831;&#x544A;&#x7D50;&#x679C;&#x662F;&#x57FA;&#x65BC; 2,000,000 &#x6B21;&#x8FED;&#x4EE3;&#x7684;&#x5E73;&#x5747;&#x904B;&#x884C;&#x6642;&#x9593;&#x7D71;&#x8A08;.</p>
<p>&#x9019;&#x500B;&#x6539;&#x9032;&#x63D0;&#x965E;&#x6027;&#x80FD;&#x7D04; 35%, &#x5831;&#x544A;&#x7D50;&#x679C;&#x662F;&#x57FA;&#x65BC; 2,000,000 &#x6B21;&#x8FED;&#x4EE3;&#x7684;&#x5E73;&#x5747;&#x904B;&#x884C;&#x6642;&#x9593;&#x7D71;&#x8A08;.</p>
<pre><code>$ go test -bench=.
PASS
BenchmarkIsPalindrome-8 2000000 697 ns/op
ok gopl.io/ch11/word2 1.468s
</code></pre><p>&#x5982;&#x9019;&#x7B87;&#x4F8B;&#x5B50;&#x6240;&#x793A;, &#x5FEB;&#x7684;&#x7A0B;&#x5E8F;&#x5F80;&#x5F80;&#x662F;&#x6709;&#x5F88;&#x5C11;&#x7684;&#x5167;&#x5B58;&#x5206;&#x914D;. <code>-benchmem</code> &#x547D;&#x4EE4;&#x884C;&#x6A19;&#x8A8C;&#x53C3;&#x6578;&#x5C07;&#x5728;&#x5831;&#x544A;&#x4E2D;&#x5305;&#x542B;&#x5167;&#x5B58;&#x7684;&#x5206;&#x914D;&#x6578;&#x64DA;&#x7D71;&#x8A08;. &#x6211;&#x5011;&#x53EF;&#x4EE5;&#x6BD4;&#x8F03;&#x512A;&#x5316;&#x524D;&#x5F8C;&#x5167;&#x5B58;&#x7684;&#x5206;&#x914D;&#x60C5;&#x6CC1;:</p>
</code></pre><p>&#x5982;&#x9019;&#x500B;&#x4F8B;&#x5B50;&#x6240;&#x793A;, &#x5FEB;&#x7684;&#x7A0B;&#x5E8F;&#x5F80;&#x5F80;&#x662F;&#x6709;&#x5F88;&#x5C11;&#x7684;&#x5167;&#x5B58;&#x5206;&#x914D;. <code>-benchmem</code> &#x547D;&#x4EE4;&#x884C;&#x6A19;&#x8A8C;&#x53C3;&#x6578;&#x5C07;&#x5728;&#x5831;&#x544A;&#x4E2D;&#x5305;&#x542B;&#x5167;&#x5B58;&#x7684;&#x5206;&#x914D;&#x6578;&#x64DA;&#x7D71;&#x8A08;. &#x6211;&#x5011;&#x53EF;&#x4EE5;&#x6BD4;&#x8F03;&#x512A;&#x5316;&#x524D;&#x5F8C;&#x5167;&#x5B58;&#x7684;&#x5206;&#x914D;&#x60C5;&#x6CC1;:</p>
<pre><code>$ go test -bench=. -benchmem
PASS
BenchmarkIsPalindrome 1000000 1026 ns/op 304 B/op 4 allocs/op
@@ -2115,16 +2079,16 @@ BenchmarkIsPalindrome 1000000 1026 ns/op 304 B/op 4 allocs/op
PASS
BenchmarkIsPalindrome 2000000 807 ns/op 128 B/op 1 allocs/op
</code></pre><p>&#x4E00;&#x6B21;&#x5167;&#x5B58;&#x5206;&#x914D;&#x4EE3;&#x66FF;&#x591A;&#x6B21;&#x7684;&#x5167;&#x5B58;&#x5206;&#x914D;&#x7BC0;&#x7701;&#x4E86;75%&#x7684;&#x5206;&#x914D;&#x8ABF;&#x7528;&#x6B21;&#x6578;&#x548C;&#x6E1B;&#x5C11;&#x8FD1;&#x4E00;&#x534A;&#x7684;&#x5167;&#x5B58;&#x9700;&#x6C42;.</p>
<p>&#x9019;&#x7B87;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x544A;&#x8A34;&#x6211;&#x5011;&#x6240;&#x9700;&#x7684;&#x7D55;&#x5C0D;&#x6642;&#x9593;&#x4F9D;&#x8CF4;&#x7D66;&#x5B9A;&#x7684;&#x5177;&#x9AD4;&#x64CD;&#x4F5C;, &#x5169;&#x7B87;&#x4E0D;&#x8855;&#x7684;&#x64CD;&#x4F5C;&#x6240;&#x9700;&#x6642;&#x9593;&#x7684;&#x5DEE;&#x7570;&#x4E5F;&#x662F;&#x548C;&#x4E0D;&#x8855;&#x74B0;&#x5883;&#x76F8;&#x95DC;&#x7684;. &#x4F8B;&#x5982;, &#x5982;&#x679C;&#x4E00;&#x7B87;&#x51FD;&#x6578;&#x9700;&#x8981; 1ms &#x8655;&#x7406; 1,000 &#x7B87;&#x5143;&#x7D20;, &#x90A3;&#x9EBC;&#x8655;&#x7406; 10000 &#x6216; 1&#x767E;&#x842C; &#x5C07;&#x9700;&#x8981;&#x591A;&#x5C11;&#x6642;&#x9593;&#x5462;? &#x9019;&#x6A23;&#x7684;&#x6BD4;&#x8F03;&#x63ED;&#x793A;&#x4E86;&#x6F38;&#x8FD1;&#x589E;&#x9577;&#x51FD;&#x6578;&#x7684;&#x904B;&#x884C;&#x6642;&#x9593;. &#x53E6;&#x4E00;&#x7B87;&#x4F8B;&#x5B50;: I/O &#x7DE9;&#x5B58;&#x8A72;&#x8A2D;&#x7F6E;&#x7232;&#x591A;&#x5927;&#x5462;? &#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x53EF;&#x4EE5;&#x5E6B;&#x52A9;&#x6211;&#x5011;&#x9078;&#x64C7;&#x8F03;&#x5C0F;&#x7684;&#x7DE9;&#x5B58;&#x4F46;&#x80FD;&#x5E36;&#x4F86;&#x6EFF;&#x610F;&#x7684;&#x6027;&#x80FD;. &#x7B2C;&#x4E09;&#x7B87;&#x4F8B;&#x5B50;: &#x5C0D;&#x65BC;&#x4E00;&#x7B87;&#x78BA;&#x5B9A;&#x7684;&#x5DE5;&#x4F5C;&#x90A3;&#x7A2E;&#x7B97;&#x6CD5;&#x66F4;&#x597D;? &#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x53EF;&#x4EE5;&#x8A55;&#x4F30;&#x5169;&#x7A2E;&#x4E0D;&#x8855;&#x7B97;&#x6CD5;&#x5C0D;&#x65BC;&#x76F8;&#x8855;&#x7684;&#x8F38;&#x5165;&#x5728;&#x4E0D;&#x8855;&#x7684;&#x5834;&#x666F;&#x548C;&#x8CA0;&#x8F09;&#x4E0B;&#x7684;&#x512A;&#x7F3A;&#x9EDE;.</p>
<p>&#x6BD4;&#x8F03;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x90FD;&#x662F;&#x7D50;&#x69CB;&#x985E;&#x4F3C;&#x7684;&#x4EE3;&#x78BC;. &#x5B83;&#x5011;&#x901A;&#x5E38;&#x662F;&#x5BC0;&#x7528;&#x4E00;&#x7B87;&#x53C3;&#x6578;&#x7684;&#x51FD;&#x6578;, &#x5F9E;&#x5E7E;&#x7B87;&#x6A19;&#x8A8C;&#x7684;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x5165;&#x53E3;&#x8ABF;&#x7528;, &#x5C31;&#x50CF;&#x9019;&#x6A23;:</p>
<p>&#x9019;&#x500B;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x544A;&#x8A34;&#x6211;&#x5011;&#x6240;&#x9700;&#x7684;&#x7D76;&#x5C0D;&#x6642;&#x9593;&#x4F9D;&#x8CF4;&#x7D66;&#x5B9A;&#x7684;&#x5177;&#x9AD4;&#x64CD;&#x4F5C;, &#x5169;&#x500B;&#x4E0D;&#x540C;&#x7684;&#x64CD;&#x4F5C;&#x6240;&#x9700;&#x6642;&#x9593;&#x7684;&#x5DEE;&#x7570;&#x4E5F;&#x662F;&#x548C;&#x4E0D;&#x540C;&#x74B0;&#x5883;&#x76F8;&#x95DC;&#x7684;. &#x4F8B;&#x5982;, &#x5982;&#x679C;&#x4E00;&#x500B;&#x51FD;&#x6578;&#x9700;&#x8981; 1ms &#x8655;&#x7406; 1,000 &#x500B;&#x5143;&#x7D20;, &#x90A3;&#x9EBD;&#x8655;&#x7406; 10000 &#x6216; 1&#x767E;&#x842C; &#x5C07;&#x9700;&#x8981;&#x591A;&#x5C11;&#x6642;&#x9593;&#x5462;? &#x9019;&#x6A23;&#x7684;&#x6BD4;&#x8F03;&#x63ED;&#x793A;&#x4E86;&#x6F38;&#x8FD1;&#x589E;&#x9577;&#x51FD;&#x6578;&#x7684;&#x904B;&#x884C;&#x6642;&#x9593;. &#x53E6;&#x4E00;&#x500B;&#x4F8B;&#x5B50;: I/O &#x7DE9;&#x5B58;&#x8A72;&#x8A2D;&#x7F6E;&#x7232;&#x591A;&#x5927;&#x5462;? &#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x53EF;&#x4EE5;&#x5E6B;&#x52A9;&#x6211;&#x5011;&#x9078;&#x64C7;&#x8F03;&#x5C0F;&#x7684;&#x7DE9;&#x5B58;&#x4F46;&#x80FD;&#x5E36;&#x4F86;&#x6EFF;&#x610F;&#x7684;&#x6027;&#x80FD;. &#x7B2C;&#x4E09;&#x500B;&#x4F8B;&#x5B50;: &#x5C0D;&#x65BC;&#x4E00;&#x500B;&#x78BA;&#x5B9A;&#x7684;&#x5DE5;&#x4F5C;&#x90A3;&#x7A2E;&#x7B97;&#x6CD5;&#x66F4;&#x597D;? &#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x53EF;&#x4EE5;&#x8A55;&#x4F30;&#x5169;&#x7A2E;&#x4E0D;&#x540C;&#x7B97;&#x6CD5;&#x5C0D;&#x65BC;&#x76F8;&#x540C;&#x7684;&#x8F38;&#x5165;&#x5728;&#x4E0D;&#x540C;&#x7684;&#x5834;&#x666F;&#x548C;&#x8CA0;&#x8F09;&#x4E0B;&#x7684;&#x512A;&#x7F3A;&#x9EDE;.</p>
<p>&#x6BD4;&#x8F03;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x90FD;&#x662F;&#x7D50;&#x69CB;&#x985E;&#x4F3C;&#x7684;&#x4EE3;&#x78BC;. &#x5B83;&#x5011;&#x901A;&#x5E38;&#x662F;&#x91C7;&#x7528;&#x4E00;&#x500B;&#x53C3;&#x6578;&#x7684;&#x51FD;&#x6578;, &#x5F9E;&#x5E7E;&#x500B;&#x6A19;&#x8A8C;&#x7684;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x51FD;&#x6578;&#x5165;&#x53E3;&#x8ABF;&#x7528;, &#x5C31;&#x50CF;&#x9019;&#x6A23;:</p>
<pre><code class="lang-Go"><span class="hljs-keyword">func</span> benchmark(b *testing.B, size <span class="hljs-typename">int</span>) { <span class="hljs-comment">/* ... */</span> }
<span class="hljs-keyword">func</span> Benchmark10(b *testing.B) { benchmark(b, <span class="hljs-number">10</span>) }
<span class="hljs-keyword">func</span> Benchmark100(b *testing.B) { benchmark(b, <span class="hljs-number">100</span>) }
<span class="hljs-keyword">func</span> Benchmark1000(b *testing.B) { benchmark(b, <span class="hljs-number">1000</span>) }
</code></pre>
<p>&#x901A;&#x904E;&#x51FD;&#x6578;&#x53C3;&#x6578;&#x4F86;&#x6307;&#x5B9A;&#x8F38;&#x5165;&#x7684;&#x5927;&#x5C0F;, &#x4F46;&#x662F;&#x53C3;&#x6578;&#x8B8A;&#x91CF;&#x5C0D;&#x65BC;&#x6BCF;&#x7B87;&#x5177;&#x9AD4;&#x7684;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x90FD;&#x662F;&#x56FA;&#x5B9A;&#x7684;. &#x8981;&#x907F;&#x514D;&#x76F4;&#x63A5;&#x8129;&#x6539; b.N &#x4F86;&#x63A7;&#x88FD;&#x8F38;&#x5165;&#x7684;&#x5927;&#x5C0F;. &#x9664;&#x975E;&#x4F60;&#x5C07;&#x5B83;&#x4F5C;&#x7232;&#x4E00;&#x7B87;&#x56FA;&#x5B9A;&#x5927;&#x5C0F;&#x7684;&#x8FED;&#x4EE3;&#x8A08;&#x7B97;&#x8F38;&#x5165;, &#x5426;&#x5247;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x7684;&#x7D50;&#x679C;&#x5C07;&#x6BEB;&#x7121;&#x610F;&#x7FA9;.</p>
<p>&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x5C0D;&#x65BC;&#x7DE8;&#x5BEB;&#x4EE3;&#x78BC;&#x662F;&#x5F88;&#x6709;&#x5E6B;&#x52A9;&#x7684;, &#x4F46;&#x662F;&#x537D;&#x4F7F;&#x5DE5;&#x4F5C;&#x5B8C;&#x6210;&#x4E86;&#x61C9;&#x61C9;&#x5679;&#x4FDD;&#x5B58;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;. &#x56E0;&#x7232;&#x96A8;&#x7740;&#x9805;&#x76EE;&#x7684;&#x767C;&#x5C55;, &#x6216;&#x8005;&#x662F;&#x8F38;&#x5165;&#x7684;&#x589E;&#x52A0;, &#x6216;&#x8005;&#x662F;&#x90E8;&#x7F72;&#x5230;&#x65B0;&#x7684;&#x64CD;&#x4F5C;&#x7E6B;&#x7D71;&#x6216;&#x4E0D;&#x8855;&#x7684;&#x8655;&#x7406;&#x5668;, &#x6211;&#x5011;&#x53EF;&#x4EE5;&#x518D;&#x6B21;&#x7528;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x4F86;&#x5E6B;&#x52A9;&#x6211;&#x5011;&#x6539;&#x9032;&#x8A2D;&#x8A08;.</p>
<p><strong>&#x7DF4;&#x7FD2; 11.6:</strong> &#x7232; 2.6.2&#x7BC0; &#x7684; &#x7DF4;&#x7FD2; 2.4 &#x548C; &#x7DF4;&#x7FD2; 2.5 &#x7684; PopCount &#x51FD;&#x6578;&#x7DE8;&#x5BEB;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;. &#x770B;&#x770B;&#x57FA;&#x65BC;&#x9336;&#x683C;&#x7B97;&#x6CD5;&#x5728;&#x4E0D;&#x8855;&#x60C5;&#x6CC1;&#x4E0B;&#x7684;&#x6027;&#x80FD;.</p>
<p>&#x901A;&#x904E;&#x51FD;&#x6578;&#x53C3;&#x6578;&#x4F86;&#x6307;&#x5B9A;&#x8F38;&#x5165;&#x7684;&#x5927;&#x5C0F;, &#x4F46;&#x662F;&#x53C3;&#x6578;&#x8B8A;&#x91CF;&#x5C0D;&#x65BC;&#x6BCF;&#x500B;&#x5177;&#x9AD4;&#x7684;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x90FD;&#x662F;&#x56FA;&#x5B9A;&#x7684;. &#x8981;&#x907F;&#x514D;&#x76F4;&#x63A5;&#x8129;&#x6539; b.N &#x4F86;&#x63A7;&#x88FD;&#x8F38;&#x5165;&#x7684;&#x5927;&#x5C0F;. &#x9664;&#x975E;&#x4F60;&#x5C07;&#x5B83;&#x4F5C;&#x7232;&#x4E00;&#x500B;&#x56FA;&#x5B9A;&#x5927;&#x5C0F;&#x7684;&#x8FED;&#x4EE3;&#x8A08;&#x7B97;&#x8F38;&#x5165;, &#x5426;&#x5247;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x7684;&#x7D50;&#x679C;&#x5C07;&#x6BEB;&#x7121;&#x610F;&#x7FA9;.</p>
<p>&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x5C0D;&#x65BC;&#x7DE8;&#x5BEB;&#x4EE3;&#x78BC;&#x662F;&#x5F88;&#x6709;&#x5E6B;&#x52A9;&#x7684;, &#x4F46;&#x662F;&#x537D;&#x4F7F;&#x5DE5;&#x4F5C;&#x5B8C;&#x6210;&#x4E86;&#x61C9;&#x61C9;&#x7576;&#x4FDD;&#x5B58;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;. &#x56E0;&#x7232;&#x96A8;&#x7740;&#x9805;&#x76EE;&#x7684;&#x767C;&#x5C55;, &#x6216;&#x8005;&#x662F;&#x8F38;&#x5165;&#x7684;&#x589E;&#x52A0;, &#x6216;&#x8005;&#x662F;&#x90E8;&#x7F72;&#x5230;&#x65B0;&#x7684;&#x64CD;&#x4F5C;&#x7E6B;&#x7D71;&#x6216;&#x4E0D;&#x540C;&#x7684;&#x8655;&#x7406;&#x5668;, &#x6211;&#x5011;&#x53EF;&#x4EE5;&#x518D;&#x6B21;&#x7528;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x4F86;&#x5E6B;&#x52A9;&#x6211;&#x5011;&#x6539;&#x9032;&#x8A2D;&#x8A08;.</p>
<p><strong>&#x7DF4;&#x7FD2; 11.6:</strong> &#x7232; 2.6.2&#x7BC0; &#x7684; &#x7DF4;&#x7FD2; 2.4 &#x548C; &#x7DF4;&#x7FD2; 2.5 &#x7684; PopCount &#x51FD;&#x6578;&#x7DE8;&#x5BEB;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;. &#x770B;&#x770B;&#x57FA;&#x65BC;&#x8868;&#x683C;&#x7B97;&#x6CD5;&#x5728;&#x4E0D;&#x540C;&#x60C5;&#x6CC1;&#x4E0B;&#x7684;&#x6027;&#x80FD;.</p>
<p><strong>&#x7DF4;&#x7FD2; 11.7:</strong> &#x7232; *IntSet (&#xA7;6.5) &#x7684; Add, UnionWith &#x548C; &#x5176;&#x4ED6;&#x65B9;&#x6CD5;&#x7DE8;&#x5BEB;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;, &#x4F7F;&#x7528;&#x5927;&#x91CF;&#x96A8;&#x6A5F;&#x9F63;&#x5165;. &#x4F60;&#x53EF;&#x4EE5;&#x8B93;&#x9019;&#x4E9B;&#x65B9;&#x6CD5;&#x8DD1;&#x591A;&#x5FEB;? &#x9078;&#x64C7;&#x5B57;&#x7684;&#x5927;&#x5C0F;&#x5C0D;&#x65BC;&#x6027;&#x80FD;&#x7684;&#x5F71;&#x97FF;&#x5982;&#x4F55;? IntSet &#x548C;&#x57FA;&#x65BC;&#x5167;&#x5EFA; map &#x7684;&#x5BE6;&#x73FE;&#x76F8;&#x6BD4;&#x6709;&#x591A;&#x5FEB;?</p>

View File

@@ -48,7 +48,7 @@
<body>
<div class="book" data-level="11.5" data-chapter-title="剖析" data-filepath="ch11/ch11-05.md" data-basepath=".." data-revision="Wed Dec 16 2015 10:54:29 GMT+0800 (中国标准时间)">
<div class="book" data-level="11.5" data-chapter-title="剖析" data-filepath="ch11/ch11-05.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,24 +2024,24 @@
<section class="normal" id="section-">
<h2 id="115-&#x5256;&#x6790;">11.5. &#x5256;&#x6790;</h2>
<p>&#x6E2C;&#x91CF;&#x57FA;&#x6E96;&#x5C0D;&#x65BC;&#x8861;&#x91CF;&#x7279;&#x5B9A;&#x64CD;&#x4F5C;&#x7684;&#x6027;&#x80FD;&#x662F;&#x6709;&#x5E6B;&#x52A9;&#x7684;, &#x4F46;&#x662F;, &#x5679;&#x6211;&#x5011;&#x8996;&#x5716;&#x8B93;&#x7A0B;&#x5E8F;&#x8DD1;&#x7684;&#x66F4;&#x5FEB;&#x7684;&#x6642;&#x5019;, &#x6211;&#x5011;&#x901A;&#x5E38;&#x4F75;&#x4E0D;&#x77E5;&#x9053;&#x5F9E;&#x54EA;&#x88E1;&#x958B;&#x59CB;&#x512A;&#x5316;. &#x6BCF;&#x500B;&#x78BC;&#x8FB2;&#x90FD;&#x61C9;&#x8A72;&#x77E5;&#x9053; Donald Knuth &#x5728;1974&#x5E74;&#x7684; &#x2018;&#x2018;Structured Programming with go to Statements&#x2019;&#x2019; &#x4E0A;&#x6240;&#x8AAC;&#x7684;&#x683C;&#x8A00;. &#x96D6;&#x7136;&#x7D93;&#x5E38;&#x88AB;&#x89E3;&#x8B80;&#x7232;&#x4E0D;&#x91CD;&#x8996;&#x6027;&#x80FD;&#x7684;&#x610F;&#x601D;, &#x4F46;&#x662F;&#x5F9E;&#x539F;&#x6587;&#x6211;&#x5011;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x4E0D;&#x8855;&#x7684;&#x542B;&#x7FA9;:</p>
<p>&#x6E2C;&#x91CF;&#x57FA;&#x6E96;&#x5C0D;&#x65BC;&#x8861;&#x91CF;&#x7279;&#x5B9A;&#x64CD;&#x4F5C;&#x7684;&#x6027;&#x80FD;&#x662F;&#x6709;&#x5E6B;&#x52A9;&#x7684;, &#x4F46;&#x662F;, &#x7576;&#x6211;&#x5011;&#x8996;&#x5716;&#x8B93;&#x7A0B;&#x5E8F;&#x8DD1;&#x7684;&#x66F4;&#x5FEB;&#x7684;&#x6642;&#x5019;, &#x6211;&#x5011;&#x901A;&#x5E38;&#x4F75;&#x4E0D;&#x77E5;&#x9053;&#x5F9E;&#x54EA;&#x91CC;&#x958B;&#x59CB;&#x512A;&#x5316;. &#x6BCF;&#x500B;&#x78BC;&#x8FB2;&#x90FD;&#x61C9;&#x8A72;&#x77E5;&#x9053; Donald Knuth &#x5728;1974&#x5E74;&#x7684; &#x2018;&#x2018;Structured Programming with go to Statements&#x2019;&#x2019; &#x4E0A;&#x6240;&#x8AAC;&#x7684;&#x683C;&#x8A00;. &#x96D6;&#x7136;&#x7D93;&#x5E38;&#x88AB;&#x89E3;&#x8B80;&#x7232;&#x4E0D;&#x91CD;&#x8996;&#x6027;&#x80FD;&#x7684;&#x610F;&#x601D;, &#x4F46;&#x662F;&#x5F9E;&#x539F;&#x6587;&#x6211;&#x5011;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x4E0D;&#x540C;&#x7684;&#x542B;&#x7FA9;:</p>
<blockquote>
<p>&#x6BEB;&#x7121;&#x7591;&#x554F;, &#x6548;&#x7387;&#x6703;&#x5C0E;&#x7DFB;&#x5404;&#x7A2E;&#x6FEB;&#x7528;. &#x7A0B;&#x5E8F;&#x54E1;&#x9700;&#x8981;&#x6D6A;&#x8CBB;&#x5927;&#x91CF;&#x7684;&#x6642;&#x9593;&#x601D;&#x8003;, &#x6216;&#x8005;&#x64D4;&#x5FC3;, &#x88AB;&#x90E8;&#x5206;&#x7A0B;&#x5E8F;&#x7684;&#x901F;&#x5EA6;&#x6240;&#x4E7E;&#x64FE;, &#x5BE6;&#x969B;&#x4E0A;&#x9019;&#x4E9B;&#x5690;&#x8A66;&#x63D0;&#x6607;&#x6548;&#x7387;&#x7684;&#x884C;&#x7232;&#x53EF;&#x80FD;&#x7523;&#x751F;&#x5F37;&#x70C8;&#x7684;&#x8CA0;&#x9EAB;&#x5F71;&#x97FF;, &#x7279;&#x5F46;&#x662F;&#x5679;&#x8ABF;&#x8A66;&#x548C;&#x7DAD;&#x8B77;&#x7684;&#x6642;&#x5019;. &#x6211;&#x5011;&#x4E0D;&#x61C9;&#x8A72;&#x904E;&#x5EA6;&#x7CFE;&#x7D50;&#x65BC;&#x7D30;&#x7BC0;&#x7684;&#x512A;&#x5316;, &#x61C9;&#x8A72;&#x8AAC;&#x7D04;97%&#x7684;&#x5834;&#x666F;: &#x904E;&#x65E9;&#x7684;&#x512A;&#x5316;&#x662F;&#x842C;&#x60E1;&#x4E4B;&#x6E90;.</p>
<p>&#x6211;&#x5011;&#x5679;&#x7136;&#x4E0D;&#x61C9;&#x8A72;&#x653E;&#x68C4;&#x90A3;&#x95DC;&#x9375;&#x7684;3%&#x7684;&#x6A5F;&#x6703;. &#x4E00;&#x500B;&#x597D;&#x7684;&#x7A0B;&#x5E8F;&#x54E1;&#x4E0D;&#x6703;&#x56E0;&#x7232;&#x9019;&#x500B;&#x7406;&#x7531;&#x800C;&#x6EFF;&#x8DB3;, &#x4ED6;&#x5011;&#x6703;&#x660E;&#x667A;&#x5730;&#x89C0;&#x5BDF;&#x548C;&#x8B58;&#x5F46;&#x54EA;&#x4E9B;&#x662F;&#x95DC;&#x9375;&#x7684;&#x4EE3;&#x78BC;; &#x4F46;&#x662F;&#x96BB;&#x6709;&#x5728;&#x95DC;&#x9375;&#x4EE3;&#x78BC;&#x5DF2;&#x7D93;&#x88AB;&#x78BA;&#x8A8D;&#x7684;&#x524D;&#x63D0;&#x4E0B;&#x7E94;&#x6703;&#x9032;&#x884C;&#x512A;&#x5316;. &#x5C0D;&#x65BC;&#x5224;&#x65B7;&#x54EA;&#x4E9B;&#x90E8;&#x5206;&#x662F;&#x95DC;&#x9375;&#x4EE3;&#x78BC;&#x662F;&#x7D93;&#x5E38;&#x5BB9;&#x6613;&#x72AF;&#x7D93;&#x9A57;&#x6027;&#x932F;&#x8AA4;&#x7684;&#x5730;&#x65B9;, &#x56E0;&#x6B64;&#x7A0B;&#x5E8F;&#x54E1;&#x666E;&#x901A;&#x4F7F;&#x7528;&#x7684;&#x6E2C;&#x91CF;&#x5DE5;&#x5177;, &#x4F7F;&#x5F97;&#x4ED6;&#x5011;&#x7684;&#x76F4;&#x89BA;&#x5F88;&#x4E0D;&#x9760;&#x8B5C;.</p>
<p>&#x6BEB;&#x7121;&#x7591;&#x554F;, &#x6548;&#x7387;&#x6703;&#x5C0E;&#x81F4;&#x5404;&#x7A2E;&#x6FEB;&#x7528;. &#x7A0B;&#x5E8F;&#x54E1;&#x9700;&#x8981;&#x6D6A;&#x8CBB;&#x5927;&#x91CF;&#x7684;&#x6642;&#x9593;&#x601D;&#x8003;, &#x6216;&#x8005;&#x64D4;&#x5FC3;, &#x88AB;&#x90E8;&#x5206;&#x7A0B;&#x5E8F;&#x7684;&#x901F;&#x5EA6;&#x6240;&#x69A6;&#x64FE;, &#x5BE6;&#x969B;&#x4E0A;&#x9019;&#x4E9B;&#x5690;&#x8A66;&#x63D0;&#x965E;&#x6548;&#x7387;&#x7684;&#x884C;&#x7232;&#x53EF;&#x80FD;&#x7523;&#x751F;&#x5F37;&#x70C8;&#x7684;&#x8CA0;&#x9762;&#x5F71;&#x97FF;, &#x7279;&#x522B;&#x662F;&#x7576;&#x8ABF;&#x8A66;&#x548C;&#x7DAD;&#x8B77;&#x7684;&#x6642;&#x5019;. &#x6211;&#x5011;&#x4E0D;&#x61C9;&#x8A72;&#x904E;&#x5EA6;&#x7CFE;&#x7D50;&#x65BC;&#x7D30;&#x7BC0;&#x7684;&#x512A;&#x5316;, &#x61C9;&#x8A72;&#x8AAC;&#x7D04;97%&#x7684;&#x5834;&#x666F;: &#x904E;&#x65E9;&#x7684;&#x512A;&#x5316;&#x662F;&#x842C;&#x60E1;&#x4E4B;&#x6E90;.</p>
<p>&#x6211;&#x5011;&#x7576;&#x7136;&#x4E0D;&#x61C9;&#x8A72;&#x653E;&#x68C4;&#x90A3;&#x95DC;&#x9375;&#x7684;3%&#x7684;&#x6A5F;&#x6703;. &#x4E00;&#x500B;&#x597D;&#x7684;&#x7A0B;&#x5E8F;&#x54E1;&#x4E0D;&#x6703;&#x56E0;&#x7232;&#x9019;&#x500B;&#x7406;&#x7531;&#x800C;&#x6EFF;&#x8DB3;, &#x4ED6;&#x5011;&#x6703;&#x660E;&#x667A;&#x5730;&#x89C0;&#x5BDF;&#x548C;&#x8B58;&#x522B;&#x54EA;&#x4E9B;&#x662F;&#x95DC;&#x9375;&#x7684;&#x4EE3;&#x78BC;; &#x4F46;&#x662F;&#x96BB;&#x6709;&#x5728;&#x95DC;&#x9375;&#x4EE3;&#x78BC;&#x5DF2;&#x7D93;&#x88AB;&#x78BA;&#x8A8D;&#x7684;&#x524D;&#x63D0;&#x4E0B;&#x7E94;&#x6703;&#x9032;&#x884C;&#x512A;&#x5316;. &#x5C0D;&#x65BC;&#x5224;&#x65B7;&#x54EA;&#x4E9B;&#x90E8;&#x5206;&#x662F;&#x95DC;&#x9375;&#x4EE3;&#x78BC;&#x662F;&#x7D93;&#x5E38;&#x5BB9;&#x6613;&#x72AF;&#x7D93;&#x9A57;&#x6027;&#x932F;&#x8AA4;&#x7684;&#x5730;&#x65B9;, &#x56E0;&#x6B64;&#x7A0B;&#x5E8F;&#x54E1;&#x666E;&#x901A;&#x4F7F;&#x7528;&#x7684;&#x6E2C;&#x91CF;&#x5DE5;&#x5177;, &#x4F7F;&#x5F97;&#x4ED6;&#x5011;&#x7684;&#x76F4;&#x89BA;&#x5F88;&#x4E0D;&#x9760;&#x8B5C;.</p>
</blockquote>
<p>&#x5679;&#x6211;&#x5011;&#x60F3;&#x4ED4;&#x7D30;&#x89C0;&#x5BDF;&#x6211;&#x5011;&#x7A0B;&#x5E8F;&#x7684;&#x904B;&#x884C;&#x901F;&#x5EA6;&#x7684;&#x6642;&#x5019;, &#x6700;&#x597D;&#x7684;&#x6280;&#x8853;&#x662F;&#x5982;&#x4F55;&#x8B58;&#x5F46;&#x95DC;&#x9375;&#x4EE3;&#x78BC;. &#x81EA;&#x52D5;&#x5316;&#x7684;&#x5256;&#x6790;&#x6280;&#x8853;&#x662F;&#x57FA;&#x65BC;&#x7A0B;&#x5E8F;&#x57F7;&#x884C;&#x671F;&#x9593;&#x4E00;&#x4E9B;&#x62BD;&#x6A23;&#x6578;&#x64DA;, &#x7136;&#x5F8C;&#x63A8;&#x65B7;&#x5F8C;&#x9EAB;&#x7684;&#x57F7;&#x884C;&#x72C0;&#x614B;; &#x6700;&#x7D42;&#x7523;&#x751F;&#x4E00;&#x500B;&#x904B;&#x884C;&#x6642;&#x9593;&#x7684;&#x7D71;&#x8A08;&#x6578;&#x64DA;&#x6587;&#x4EF6;.</p>
<p>Go&#x8A9E;&#x8A00;&#x652F;&#x6301;&#x591A;&#x7A2E;&#x985E;&#x578B;&#x7684;&#x5256;&#x6790;&#x6027;&#x80FD;&#x5206;&#x6790;, &#x6BCF;&#x4E00;&#x7A2E;&#x95DC;&#x8A3B;&#x4E0D;&#x8855;&#x7684;&#x65B9;&#x9EAB;, &#x4F46;&#x5B83;&#x5011;&#x90FD;&#x6D89;&#x53CA;&#x5230;&#x6BCF;&#x500B;&#x5BC0;&#x6A23;&#x8A18;&#x5F54;&#x7684;&#x611F;&#x8208;&#x8DA3;&#x7684;&#x4E00;&#x7E6B;&#x5217;&#x4E8B;&#x4EF6;&#x6D88;&#x606F;, &#x6BCF;&#x500B;&#x4E8B;&#x4EF6;&#x90FD;&#x5305;&#x542B;&#x51FD;&#x6578;&#x8ABF;&#x7528;&#x6642;&#x51FD;&#x6578;&#x8ABF;&#x7528;&#x5806;&#x68E7;&#x7684;&#x4FE1;&#x606F;. &#x5167;&#x5EFA;&#x7684; <code>go test</code> &#x5DE5;&#x5177;&#x5C0D;&#x5E7E;&#x7A2E;&#x5206;&#x6790;&#x65B9;&#x5F0F;&#x90FD;&#x63D0;&#x4F9B;&#x4E86;&#x652F;&#x6301;.</p>
<p>CPU&#x5206;&#x6790;&#x6587;&#x4EF6;&#x6A19;&#x8B58;&#x4E86;&#x51FD;&#x6578;&#x57F7;&#x884C;&#x6642;&#x6240;&#x9700;&#x8981;&#x7684;CPU&#x6642;&#x9593;. &#x5679;&#x524D;&#x904B;&#x884C;&#x7684;&#x7E6B;&#x7D71;&#x7DDA;&#x7A0B;&#x5728;&#x6BCF;&#x9694;&#x5E7E;&#x6BEB;&#x79D2;&#x90FD;&#x6703;&#x9047;&#x5230;&#x64CD;&#x4F5C;&#x7E6B;&#x7D71;&#x7684;&#x4E2D;&#x65B7;&#x4E8B;&#x4EF6;, &#x6BCF;&#x6B21;&#x4E2D;&#x65B7;&#x6642;&#x90FD;&#x6703;&#x8A18;&#x5F54;&#x4E00;&#x500B;&#x5206;&#x6790;&#x6587;&#x4EF6;&#x7136;&#x5F8C;&#x6062;&#x5FA9;&#x6B63;&#x5E38;&#x7684;&#x904B;&#x884C;.</p>
<p>&#x5806;&#x5206;&#x6790;&#x5247;&#x8A18;&#x5F54;&#x4E86;&#x7A0B;&#x5E8F;&#x7684;&#x5167;&#x5B58;&#x4F7F;&#x7528;&#x60C5;&#x6CC1;. &#x6BCF;&#x500B;&#x5167;&#x5B58;&#x5206;&#x914D;&#x64CD;&#x4F5C;&#x90FD;&#x6703;&#x89F8;&#x767C;&#x5167;&#x90E8;&#x5E73;&#x5747;&#x5167;&#x5B58;&#x5206;&#x914D;&#x4F8B;&#x7A0B;, &#x6BCF;&#x500B; 512KB &#x7684;&#x5167;&#x5B58;&#x7533;&#x8ACB;&#x90FD;&#x6703;&#x89F8;&#x767C;&#x4E00;&#x500B;&#x4E8B;&#x4EF6;.</p>
<p>&#x963B;&#x585E;&#x5206;&#x6790;&#x5247;&#x8A18;&#x5F54;&#x4E86;goroutine&#x6700;&#x5927;&#x7684;&#x963B;&#x585E;&#x64CD;&#x4F5C;, &#x4F8B;&#x5982;&#x7E6B;&#x7D71;&#x8ABF;&#x7528;, &#x7BA1;&#x9053;&#x767C;&#x9001;&#x548C;&#x63A5;&#x6536;, &#x9084;&#x6709;&#x7A6B;&#x53D6;&#x9396;&#x7B49;. &#x5206;&#x6790;&#x5EAB;&#x6703;&#x8A18;&#x5F54;&#x6BCF;&#x500B;goroutine&#x88AB;&#x963B;&#x585E;&#x6642;&#x7684;&#x76F8;&#x95DC;&#x64CD;&#x4F5C;.</p>
<p>&#x5728;&#x6E2C;&#x8A66;&#x74B0;&#x5883;&#x4E0B;&#x96BB;&#x9700;&#x8981;&#x4E00;&#x500B;&#x6A19;&#x8A8C;&#x8518;&#x6578;&#x5C31;&#x53EF;&#x4EE5;&#x751F;&#x6210;&#x5404;&#x7A2E;&#x5206;&#x6790;&#x6587;&#x4EF6;. &#x5679;&#x4E00;&#x6B21;&#x4F7F;&#x7528;&#x591A;&#x500B;&#x6A19;&#x8A8C;&#x8518;&#x6578;&#x6642;&#x9700;&#x8981;&#x5679;&#x5FC3;, &#x56E0;&#x7232;&#x5206;&#x6790;&#x64CD;&#x4F5C;&#x672C;&#x8EAB;&#x4E5F;&#x53EF;&#x80FD;&#x6703;&#x5F71;&#x50CF;&#x7A0B;&#x5E8F;&#x7684;&#x904B;&#x884C;.</p>
<p>&#x7576;&#x6211;&#x5011;&#x60F3;&#x4ED4;&#x7D30;&#x89C0;&#x5BDF;&#x6211;&#x5011;&#x7A0B;&#x5E8F;&#x7684;&#x904B;&#x884C;&#x901F;&#x5EA6;&#x7684;&#x6642;&#x5019;, &#x6700;&#x597D;&#x7684;&#x6280;&#x8853;&#x662F;&#x5982;&#x4F55;&#x8B58;&#x522B;&#x95DC;&#x9375;&#x4EE3;&#x78BC;. &#x81EA;&#x52D5;&#x5316;&#x7684;&#x5256;&#x6790;&#x6280;&#x8853;&#x662F;&#x57FA;&#x65BC;&#x7A0B;&#x5E8F;&#x57F7;&#x884C;&#x671F;&#x9593;&#x4E00;&#x4E9B;&#x62BD;&#x6A23;&#x6578;&#x64DA;, &#x7136;&#x5F8C;&#x63A8;&#x65B7;&#x5F8C;&#x9762;&#x7684;&#x57F7;&#x884C;&#x72C0;&#x614B;; &#x6700;&#x7D42;&#x7523;&#x751F;&#x4E00;&#x500B;&#x904B;&#x884C;&#x6642;&#x9593;&#x7684;&#x7D71;&#x8A08;&#x6578;&#x64DA;&#x6587;&#x4EF6;.</p>
<p>Go&#x8A9E;&#x8A00;&#x652F;&#x6301;&#x591A;&#x7A2E;&#x985E;&#x578B;&#x7684;&#x5256;&#x6790;&#x6027;&#x80FD;&#x5206;&#x6790;, &#x6BCF;&#x4E00;&#x7A2E;&#x95DC;&#x8A3B;&#x4E0D;&#x540C;&#x7684;&#x65B9;&#x9762;, &#x4F46;&#x5B83;&#x5011;&#x90FD;&#x6D89;&#x53CA;&#x5230;&#x6BCF;&#x500B;&#x91C7;&#x6A23;&#x8A18;&#x9332;&#x7684;&#x611F;&#x8208;&#x8DA3;&#x7684;&#x4E00;&#x7E6B;&#x5217;&#x4E8B;&#x4EF6;&#x6D88;&#x606F;, &#x6BCF;&#x500B;&#x4E8B;&#x4EF6;&#x90FD;&#x5305;&#x542B;&#x51FD;&#x6578;&#x8ABF;&#x7528;&#x6642;&#x51FD;&#x6578;&#x8ABF;&#x7528;&#x5806;&#x68E7;&#x7684;&#x4FE1;&#x606F;. &#x5167;&#x5EFA;&#x7684; <code>go test</code> &#x5DE5;&#x5177;&#x5C0D;&#x5E7E;&#x7A2E;&#x5206;&#x6790;&#x65B9;&#x5F0F;&#x90FD;&#x63D0;&#x4F9B;&#x4E86;&#x652F;&#x6301;.</p>
<p>CPU&#x5206;&#x6790;&#x6587;&#x4EF6;&#x6A19;&#x8B58;&#x4E86;&#x51FD;&#x6578;&#x57F7;&#x884C;&#x6642;&#x6240;&#x9700;&#x8981;&#x7684;CPU&#x6642;&#x9593;. &#x7576;&#x524D;&#x904B;&#x884C;&#x7684;&#x7E6B;&#x7D71;&#x7DDA;&#x7A0B;&#x5728;&#x6BCF;&#x9694;&#x5E7E;&#x6BEB;&#x79D2;&#x90FD;&#x6703;&#x9047;&#x5230;&#x64CD;&#x4F5C;&#x7E6B;&#x7D71;&#x7684;&#x4E2D;&#x65B7;&#x4E8B;&#x4EF6;, &#x6BCF;&#x6B21;&#x4E2D;&#x65B7;&#x6642;&#x90FD;&#x6703;&#x8A18;&#x9332;&#x4E00;&#x500B;&#x5206;&#x6790;&#x6587;&#x4EF6;&#x7136;&#x5F8C;&#x6062;&#x8907;&#x6B63;&#x5E38;&#x7684;&#x904B;&#x884C;.</p>
<p>&#x5806;&#x5206;&#x6790;&#x5247;&#x8A18;&#x9332;&#x4E86;&#x7A0B;&#x5E8F;&#x7684;&#x5167;&#x5B58;&#x4F7F;&#x7528;&#x60C5;&#x6CC1;. &#x6BCF;&#x500B;&#x5167;&#x5B58;&#x5206;&#x914D;&#x64CD;&#x4F5C;&#x90FD;&#x6703;&#x89F8;&#x767C;&#x5167;&#x90E8;&#x5E73;&#x5747;&#x5167;&#x5B58;&#x5206;&#x914D;&#x4F8B;&#x7A0B;, &#x6BCF;&#x500B; 512KB &#x7684;&#x5167;&#x5B58;&#x7533;&#x8ACB;&#x90FD;&#x6703;&#x89F8;&#x767C;&#x4E00;&#x500B;&#x4E8B;&#x4EF6;.</p>
<p>&#x963B;&#x585E;&#x5206;&#x6790;&#x5247;&#x8A18;&#x9332;&#x4E86;goroutine&#x6700;&#x5927;&#x7684;&#x963B;&#x585E;&#x64CD;&#x4F5C;, &#x4F8B;&#x5982;&#x7E6B;&#x7D71;&#x8ABF;&#x7528;, &#x7BA1;&#x9053;&#x767C;&#x9001;&#x548C;&#x63A5;&#x6536;, &#x9084;&#x6709;&#x7A6B;&#x53D6;&#x9396;&#x7B49;. &#x5206;&#x6790;&#x5EAB;&#x6703;&#x8A18;&#x9332;&#x6BCF;&#x500B;goroutine&#x88AB;&#x963B;&#x585E;&#x6642;&#x7684;&#x76F8;&#x95DC;&#x64CD;&#x4F5C;.</p>
<p>&#x5728;&#x6E2C;&#x8A66;&#x74B0;&#x5883;&#x4E0B;&#x96BB;&#x9700;&#x8981;&#x4E00;&#x500B;&#x6A19;&#x8A8C;&#x53C3;&#x6578;&#x5C31;&#x53EF;&#x4EE5;&#x751F;&#x6210;&#x5404;&#x7A2E;&#x5206;&#x6790;&#x6587;&#x4EF6;. &#x7576;&#x4E00;&#x6B21;&#x4F7F;&#x7528;&#x591A;&#x500B;&#x6A19;&#x8A8C;&#x53C3;&#x6578;&#x6642;&#x9700;&#x8981;&#x7576;&#x5FC3;, &#x56E0;&#x7232;&#x5206;&#x6790;&#x64CD;&#x4F5C;&#x672C;&#x8EAB;&#x4E5F;&#x53EF;&#x80FD;&#x6703;&#x5F71;&#x50CF;&#x7A0B;&#x5E8F;&#x7684;&#x904B;&#x884C;.</p>
<pre><code>$ go test -cpuprofile=cpu.out
$ go test -blockprofile=block.out
$ go test -memprofile=mem.out
</code></pre><p>&#x5C0D;&#x65BC;&#x4E00;&#x4E9B;&#x975E;&#x6E2C;&#x8A66;&#x7A0B;&#x5E8F;&#x4E5F;&#x5F88;&#x5BB9;&#x6613;&#x652F;&#x6301;&#x5206;&#x6790;&#x7684;&#x7279;&#x6027;, &#x5177;&#x9AD4;&#x7684;&#x5BE6;&#x73FE;&#x65B9;&#x5F0F;&#x548C;&#x7A0B;&#x5E8F;&#x662F;&#x77ED;&#x6642;&#x9593;&#x904B;&#x884C;&#x7684;&#x5C0F;&#x5DE5;&#x5177;&#x9084;&#x662F;&#x9577;&#x6642;&#x9593;&#x904B;&#x884C;&#x7684;&#x670D;&#x52D9;&#x6703;&#x6709;&#x5F88;&#x5927;&#x4E0D;&#x8855;, &#x56E0;&#x6B64;Go&#x7684;runtim&#x904B;&#x884C;&#x6642;&#x5305;&#x63D0;&#x4F9B;&#x4E86;&#x7A0B;&#x5E8F;&#x904B;&#x884C;&#x6642;&#x63A7;&#x88FD;&#x5206;&#x6790;&#x7279;&#x6027;&#x7684;&#x63A5;&#x53E3;.</p>
<p>&#x4E00;&#x65E6;&#x6211;&#x5011;&#x5DF2;&#x7D93;&#x6536;&#x96C6;&#x5230;&#x4E86;&#x7528;&#x65BC;&#x5206;&#x6790;&#x7684;&#x5BC0;&#x6A23;&#x6578;&#x64DA;, &#x6211;&#x5011;&#x5C31;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; pprof &#x64DA;&#x4F86;&#x5206;&#x6790;&#x9019;&#x4E9B;&#x6578;&#x64DA;. &#x9019;&#x662F;Go&#x5DE5;&#x5177;&#x7BB1;&#x81EA;&#x5E36;&#x7684;&#x4E00;&#x500B;&#x5DE5;&#x5177;, &#x4F46;&#x4F75;&#x4E0D;&#x662F;&#x4E00;&#x500B;&#x65E5;&#x5E38;&#x5DE5;&#x5177;, &#x5B83;&#x5C0D;&#x61C9; <code>go tool pprof</code> &#x547D;&#x4EE4;. &#x8A72;&#x547D;&#x4EE4;&#x6709;&#x8A31;&#x591A;&#x7279;&#x6027;&#x548C;&#x9078;&#x9805;, &#x4F46;&#x662F;&#x6700;&#x91CD;&#x8981;&#x7684;&#x6709;&#x5169;&#x500B;, &#x5C31;&#x662F;&#x751F;&#x6210;&#x9019;&#x500B;&#x6982;&#x8981;&#x6587;&#x4EF6;&#x7684;&#x53EF;&#x57F7;&#x884C;&#x7A0B;&#x5E8F;&#x548C;&#x5C0D;&#x65BC;&#x7684;&#x5206;&#x6790;&#x65E5;&#x8A8C;&#x6587;&#x4EF6;.</p>
<p>&#x7232;&#x4E86;&#x63D0;&#x9AD8;&#x5206;&#x6790;&#x6548;&#x7387;&#x548C;&#x6E1B;&#x5C11;&#x7A7A;&#x9593;, &#x5206;&#x6790;&#x65E5;&#x8A8C;&#x672C;&#x8EAB;&#x4F75;&#x4E0D;&#x5305;&#x542B;&#x51FD;&#x6578;&#x7684;&#x540D;&#x5B57;; &#x5B83;&#x96BB;&#x5305;&#x542B;&#x51FD;&#x6578;&#x5C0D;&#x61C9;&#x7684;&#x5730;&#x5740;. &#x4E5F;&#x5C31;&#x662F;&#x8AAC;pprof&#x9700;&#x8981;&#x548C;&#x5206;&#x6790;&#x65E5;&#x8A8C;&#x5C0D;&#x65BC;&#x7684;&#x53EF;&#x57F7;&#x884C;&#x7A0B;&#x5E8F;. &#x96D6;&#x7136; <code>go test</code> &#x547D;&#x4EE4;&#x901A;&#x5E38;&#x6703;&#x4E1F;&#x68C4;&#x81E8;&#x6642;&#x7528;&#x7684;&#x6E2C;&#x8A66;&#x7A0B;&#x5E8F;, &#x4F46;&#x662F;&#x5728;&#x5553;&#x7528;&#x5206;&#x6790;&#x7684;&#x6642;&#x5019;&#x6703;&#x5C07;&#x6E2C;&#x8A66;&#x7A0B;&#x5E8F;&#x4FDD;&#x5B58;&#x7232; foo.test &#x6587;&#x4EF6;, &#x5176;&#x4E2D; foo &#x90E8;&#x5206;&#x5C0D;&#x65BC;&#x6E2C;&#x8A66;&#x5305;&#x7684;&#x540D;&#x5B57;.</p>
<p>&#x4E0B;&#x9EAB;&#x7684;&#x547D;&#x4EE4;&#x6F14;&#x793A;&#x4E86;&#x5982;&#x4F55;&#x751F;&#x6210;&#x4E00;&#x500B;CPU&#x5206;&#x6790;&#x6587;&#x4EF6;. &#x6211;&#x5011;&#x9078;&#x64C7; <code>net/http</code> &#x5305;&#x7684;&#x4E00;&#x500B;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;. &#x901A;&#x5E38;&#x662F;&#x57FA;&#x65BC;&#x4E00;&#x500B;&#x5DF2;&#x7D93;&#x78BA;&#x5B9A;&#x4E86;&#x662F;&#x95DC;&#x9375;&#x4EE3;&#x78BC;&#x7684;&#x90E8;&#x5206;&#x9032;&#x884C;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;. &#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x6703;&#x9ED8;&#x8A8D;&#x5305;&#x542B;&#x55AE;&#x5143;&#x6E2C;&#x8A66;, &#x9019;&#x88E1;&#x6211;&#x5011;&#x7528; -run=NONE &#x7981;&#x6B62;&#x55AE;&#x5143;&#x6E2C;&#x8A66;.</p>
</code></pre><p>&#x5C0D;&#x65BC;&#x4E00;&#x4E9B;&#x975E;&#x6E2C;&#x8A66;&#x7A0B;&#x5E8F;&#x4E5F;&#x5F88;&#x5BB9;&#x6613;&#x652F;&#x6301;&#x5206;&#x6790;&#x7684;&#x7279;&#x6027;, &#x5177;&#x9AD4;&#x7684;&#x5BE6;&#x73FE;&#x65B9;&#x5F0F;&#x548C;&#x7A0B;&#x5E8F;&#x662F;&#x77ED;&#x6642;&#x9593;&#x904B;&#x884C;&#x7684;&#x5C0F;&#x5DE5;&#x5177;&#x9084;&#x662F;&#x9577;&#x6642;&#x9593;&#x904B;&#x884C;&#x7684;&#x670D;&#x52D9;&#x6703;&#x6709;&#x5F88;&#x5927;&#x4E0D;&#x540C;, &#x56E0;&#x6B64;Go&#x7684;runtim&#x904B;&#x884C;&#x6642;&#x5305;&#x63D0;&#x4F9B;&#x4E86;&#x7A0B;&#x5E8F;&#x904B;&#x884C;&#x6642;&#x63A7;&#x88FD;&#x5206;&#x6790;&#x7279;&#x6027;&#x7684;&#x63A5;&#x53E3;.</p>
<p>&#x4E00;&#x65E6;&#x6211;&#x5011;&#x5DF2;&#x7D93;&#x6536;&#x96C6;&#x5230;&#x4E86;&#x7528;&#x65BC;&#x5206;&#x6790;&#x7684;&#x91C7;&#x6A23;&#x6578;&#x64DA;, &#x6211;&#x5011;&#x5C31;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; pprof &#x64DA;&#x4F86;&#x5206;&#x6790;&#x9019;&#x4E9B;&#x6578;&#x64DA;. &#x9019;&#x662F;Go&#x5DE5;&#x5177;&#x7BB1;&#x81EA;&#x5E36;&#x7684;&#x4E00;&#x500B;&#x5DE5;&#x5177;, &#x4F46;&#x4F75;&#x4E0D;&#x662F;&#x4E00;&#x500B;&#x65E5;&#x5E38;&#x5DE5;&#x5177;, &#x5B83;&#x5C0D;&#x61C9; <code>go tool pprof</code> &#x547D;&#x4EE4;. &#x8A72;&#x547D;&#x4EE4;&#x6709;&#x8A31;&#x591A;&#x7279;&#x6027;&#x548C;&#x9078;&#x9805;, &#x4F46;&#x662F;&#x6700;&#x91CD;&#x8981;&#x7684;&#x6709;&#x5169;&#x500B;, &#x5C31;&#x662F;&#x751F;&#x6210;&#x9019;&#x500B;&#x6982;&#x8981;&#x6587;&#x4EF6;&#x7684;&#x53EF;&#x57F7;&#x884C;&#x7A0B;&#x5E8F;&#x548C;&#x5C0D;&#x65BC;&#x7684;&#x5206;&#x6790;&#x65E5;&#x8A8C;&#x6587;&#x4EF6;.</p>
<p>&#x7232;&#x4E86;&#x63D0;&#x9AD8;&#x5206;&#x6790;&#x6548;&#x7387;&#x548C;&#x6E1B;&#x5C11;&#x7A7A;&#x9593;, &#x5206;&#x6790;&#x65E5;&#x8A8C;&#x672C;&#x8EAB;&#x4F75;&#x4E0D;&#x5305;&#x542B;&#x51FD;&#x6578;&#x7684;&#x540D;&#x5B57;; &#x5B83;&#x96BB;&#x5305;&#x542B;&#x51FD;&#x6578;&#x5C0D;&#x61C9;&#x7684;&#x5730;&#x5740;. &#x4E5F;&#x5C31;&#x662F;&#x8AAC;pprof&#x9700;&#x8981;&#x548C;&#x5206;&#x6790;&#x65E5;&#x8A8C;&#x5C0D;&#x65BC;&#x7684;&#x53EF;&#x57F7;&#x884C;&#x7A0B;&#x5E8F;. &#x96D6;&#x7136; <code>go test</code> &#x547D;&#x4EE4;&#x901A;&#x5E38;&#x6703;&#x4E1F;&#x68C4;&#x81E8;&#x6642;&#x7528;&#x7684;&#x6E2C;&#x8A66;&#x7A0B;&#x5E8F;, &#x4F46;&#x662F;&#x5728;&#x555F;&#x7528;&#x5206;&#x6790;&#x7684;&#x6642;&#x5019;&#x6703;&#x5C07;&#x6E2C;&#x8A66;&#x7A0B;&#x5E8F;&#x4FDD;&#x5B58;&#x7232; foo.test &#x6587;&#x4EF6;, &#x5176;&#x4E2D; foo &#x90E8;&#x5206;&#x5C0D;&#x65BC;&#x6E2C;&#x8A66;&#x5305;&#x7684;&#x540D;&#x5B57;.</p>
<p>&#x4E0B;&#x9762;&#x7684;&#x547D;&#x4EE4;&#x6F14;&#x793A;&#x4E86;&#x5982;&#x4F55;&#x751F;&#x6210;&#x4E00;&#x500B;CPU&#x5206;&#x6790;&#x6587;&#x4EF6;. &#x6211;&#x5011;&#x9078;&#x64C7; <code>net/http</code> &#x5305;&#x7684;&#x4E00;&#x500B;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;. &#x901A;&#x5E38;&#x662F;&#x57FA;&#x65BC;&#x4E00;&#x500B;&#x5DF2;&#x7D93;&#x78BA;&#x5B9A;&#x4E86;&#x662F;&#x95DC;&#x9375;&#x4EE3;&#x78BC;&#x7684;&#x90E8;&#x5206;&#x9032;&#x884C;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;. &#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x6703;&#x9ED8;&#x8A8D;&#x5305;&#x542B;&#x55AE;&#x5143;&#x6E2C;&#x8A66;, &#x9019;&#x91CC;&#x6211;&#x5011;&#x7528; -run=NONE &#x7981;&#x6B62;&#x55AE;&#x5143;&#x6E2C;&#x8A66;.</p>
<pre><code>$ go test -run=NONE -bench=ClientServerParallelTLS64 \
-cpuprofile=cpu.log net/http
PASS
@@ -2100,9 +2064,9 @@ Showing top 10 nodes out of 166 (cum &gt;= 60ms)
60ms 1.67% 68.80% 190ms 5.29% math/big.nat.montgomery
50ms 1.39% 70.19% 50ms 1.39% crypto/elliptic.p256ReduceCarry
50ms 1.39% 71.59% 60ms 1.67% crypto/elliptic.p256Sum
</code></pre><p>&#x8518;&#x6578; <code>-text</code> &#x6A19;&#x8A8C;&#x8518;&#x6578;&#x7528;&#x65BC;&#x6307;&#x5B9A;&#x8F38;&#x9F63;&#x683C;&#x5F0F;, &#x5728;&#x9019;&#x88E1;&#x6BCF;&#x884C;&#x662F;&#x4E00;&#x500B;&#x51FD;&#x6578;, &#x6839;&#x64DA;&#x4F7F;&#x7528;CPU&#x7684;&#x6642;&#x9593;&#x4F86;&#x6392;&#x5E8F;. &#x5176;&#x4E2D; <code>-nodecount=10</code> &#x6A19;&#x8A8C;&#x8518;&#x6578;&#x9650;&#x88FD;&#x4E86;&#x96BB;&#x8F38;&#x9F63;&#x524D;10&#x884C;&#x7684;&#x7D50;&#x679C;. &#x5C0D;&#x65BC;&#x56B4;&#x91CD;&#x7684;&#x6027;&#x80FD;&#x554F;&#x984C;, &#x9019;&#x500B;&#x6587;&#x672C;&#x683C;&#x5F0F;&#x57FA;&#x672C;&#x53EF;&#x4EE5;&#x5E6B;&#x52A9;&#x67FB;&#x660E;&#x539F;&#x56E0;&#x4E86;.</p>
<p>&#x9019;&#x500B;&#x6982;&#x8981;&#x6587;&#x4EF6;&#x544A;&#x8A34;&#x6211;&#x5011;, HTTPS&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x4E2D; <code>crypto/elliptic.p256ReduceDegree</code> &#x51FD;&#x6578;&#x4F54;&#x7528;&#x4E86;&#x5C07;&#x8FD1;&#x4E00;&#x822C;&#x7684;CPU&#x8CC7;&#x6E90;. &#x76F8;&#x6BD4;&#x4E4B;&#x4E0B;, &#x5982;&#x679C;&#x4E00;&#x500B;&#x6982;&#x8981;&#x6587;&#x4EF6;&#x4E2D;&#x4E3B;&#x8981;&#x662F;runtime&#x5305;&#x7684;&#x5167;&#x5B58;&#x5206;&#x914D;&#x7684;&#x51FD;&#x6578;, &#x90A3;&#x9EBD;&#x6E1B;&#x5C11;&#x5167;&#x5B58;&#x6D88;&#x8017;&#x53EF;&#x80FD;&#x662F;&#x4E00;&#x500B;&#x503C;&#x5F97;&#x5690;&#x8A66;&#x7684;&#x512A;&#x5316;&#x7B56;&#x7565;.</p>
<p>&#x5C0D;&#x65BC;&#x4E00;&#x4E9B;&#x66F4;&#x5FAE;&#x5999;&#x7684;&#x554F;&#x984C;, &#x4F60;&#x53EF;&#x80FD;&#x9700;&#x8981;&#x4F7F;&#x7528; pprof &#x7684;&#x5716;&#x5F62;&#x986F;&#x793A;&#x529F;&#x80FD;. &#x9019;&#x500B;&#x9700;&#x8981;&#x5B89;&#x88DD; GraphViz &#x5DE5;&#x5177;, &#x53EF;&#x4EE5;&#x5F9E; www.graphviz.org &#x4E0B;&#x8F09;. &#x8518;&#x6578; <code>-web</code> &#x7528;&#x65BC;&#x751F;&#x6210;&#x4E00;&#x500B;&#x6709;&#x66CF;&#x5716;&#x6587;&#x4EF6;, &#x5305;&#x542B;CPU&#x7684;&#x4F7F;&#x7528;&#x548C;&#x6700;&#x7279;&#x9EDE;&#x7684;&#x51FD;&#x6578;&#x7B49;&#x4FE1;&#x606F;.</p>
</code></pre><p>&#x53C3;&#x6578; <code>-text</code> &#x6A19;&#x8A8C;&#x53C3;&#x6578;&#x7528;&#x65BC;&#x6307;&#x5B9A;&#x8F38;&#x9F63;&#x683C;&#x5F0F;, &#x5728;&#x9019;&#x91CC;&#x6BCF;&#x884C;&#x662F;&#x4E00;&#x500B;&#x51FD;&#x6578;, &#x6839;&#x64DA;&#x4F7F;&#x7528;CPU&#x7684;&#x6642;&#x9593;&#x4F86;&#x6392;&#x5E8F;. &#x5176;&#x4E2D; <code>-nodecount=10</code> &#x6A19;&#x8A8C;&#x53C3;&#x6578;&#x9650;&#x88FD;&#x4E86;&#x96BB;&#x8F38;&#x9F63;&#x524D;10&#x884C;&#x7684;&#x7D50;&#x679C;. &#x5C0D;&#x65BC;&#x56B4;&#x91CD;&#x7684;&#x6027;&#x80FD;&#x554F;&#x984C;, &#x9019;&#x500B;&#x6587;&#x672C;&#x683C;&#x5F0F;&#x57FA;&#x672C;&#x53EF;&#x4EE5;&#x5E6B;&#x52A9;&#x67FB;&#x660E;&#x539F;&#x56E0;&#x4E86;.</p>
<p>&#x9019;&#x500B;&#x6982;&#x8981;&#x6587;&#x4EF6;&#x544A;&#x8A34;&#x6211;&#x5011;, HTTPS&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x4E2D; <code>crypto/elliptic.p256ReduceDegree</code> &#x51FD;&#x6578;&#x5360;&#x7528;&#x4E86;&#x5C07;&#x8FD1;&#x4E00;&#x822C;&#x7684;CPU&#x8CC7;&#x6E90;. &#x76F8;&#x6BD4;&#x4E4B;&#x4E0B;, &#x5982;&#x679C;&#x4E00;&#x500B;&#x6982;&#x8981;&#x6587;&#x4EF6;&#x4E2D;&#x4E3B;&#x8981;&#x662F;runtime&#x5305;&#x7684;&#x5167;&#x5B58;&#x5206;&#x914D;&#x7684;&#x51FD;&#x6578;, &#x90A3;&#x9EBD;&#x6E1B;&#x5C11;&#x5167;&#x5B58;&#x6D88;&#x8017;&#x53EF;&#x80FD;&#x662F;&#x4E00;&#x500B;&#x503C;&#x5F97;&#x5690;&#x8A66;&#x7684;&#x512A;&#x5316;&#x7B56;&#x7565;.</p>
<p>&#x5C0D;&#x65BC;&#x4E00;&#x4E9B;&#x66F4;&#x5FAE;&#x5999;&#x7684;&#x554F;&#x984C;, &#x4F60;&#x53EF;&#x80FD;&#x9700;&#x8981;&#x4F7F;&#x7528; pprof &#x7684;&#x5716;&#x5F62;&#x986F;&#x793A;&#x529F;&#x80FD;. &#x9019;&#x500B;&#x9700;&#x8981;&#x5B89;&#x88DD; GraphViz &#x5DE5;&#x5177;, &#x53EF;&#x4EE5;&#x5F9E; www.graphviz.org &#x4E0B;&#x8F09;. &#x53C3;&#x6578; <code>-web</code> &#x7528;&#x65BC;&#x751F;&#x6210;&#x4E00;&#x500B;&#x6709;&#x5411;&#x5716;&#x6587;&#x4EF6;, &#x5305;&#x542B;CPU&#x7684;&#x4F7F;&#x7528;&#x548C;&#x6700;&#x7279;&#x9EDE;&#x7684;&#x51FD;&#x6578;&#x7B49;&#x4FE1;&#x606F;.</p>
<p>&#x9019;&#x4E00;&#x7BC0;&#x6211;&#x5011;&#x96BB;&#x662F;&#x7C21;&#x55AE;&#x770B;&#x4E86;&#x4E0B;Go&#x8A9E;&#x8A00;&#x7684;&#x5206;&#x6790;&#x64DA;&#x5DE5;&#x5177;. &#x5982;&#x679C;&#x60F3;&#x4E86;&#x89E3;&#x66F4;&#x591A;, &#x53EF;&#x4EE5;&#x95B2;&#x8B80; Go&#x5B98;&#x65B9;&#x535A;&#x5BA2;&#x7684; &#x2018;&#x2018;Pro&#xFB01;ling Go Programs&#x2019;&#x2019; &#x4E00;&#x6587;.</p>

View File

@@ -48,7 +48,7 @@
<body>
<div class="book" data-level="11.6" data-chapter-title="示例函數" data-filepath="ch11/ch11-06.md" data-basepath=".." data-revision="Wed Dec 16 2015 10:54:29 GMT+0800 (中国标准时间)">
<div class="book" data-level="11.6" data-chapter-title="示例函數" data-filepath="ch11/ch11-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,7 @@
<section class="normal" id="section-">
<h2 id="116-&#x793A;&#x4F8B;&#x51FD;&#x6578;">11.6. &#x793A;&#x4F8B;&#x51FD;&#x6578;</h2>
<p>&#x7B2C;&#x4E09;&#x7A2E; <code>go test</code> &#x7279;&#x5225;&#x8655;&#x7406;&#x7684;&#x51FD;&#x6578;&#x662F;&#x793A;&#x4F8B;&#x51FD;&#x6578;, &#x4EE5; Example &#x70BA;&#x51FD;&#x6578;&#x540D;&#x958B;&#x982D;. &#x793A;&#x4F8B;&#x51FD;&#x6578;&#x6C92;&#x6709;&#x51FD;&#x6578;&#x53C3;&#x6578;&#x548C;&#x8FD4;&#x8FF4;&#x503C;. &#x4E0B;&#x9EAB;&#x662F; IsPalindrome &#x51FD;&#x6578;&#x5C0D;&#x61C9;&#x7684;&#x793A;&#x4F8B;&#x51FD;&#x6578;:</p>
<p>&#x7B2C;&#x4E09;&#x7A2E; <code>go test</code> &#x7279;&#x522B;&#x8655;&#x7406;&#x7684;&#x51FD;&#x6578;&#x662F;&#x793A;&#x4F8B;&#x51FD;&#x6578;, &#x4EE5; Example &#x7232;&#x51FD;&#x6578;&#x540D;&#x958B;&#x982D;. &#x793A;&#x4F8B;&#x51FD;&#x6578;&#x6C92;&#x6709;&#x51FD;&#x6578;&#x53C3;&#x6578;&#x548C;&#x8FD4;&#x8FF4;&#x503C;. &#x4E0B;&#x9762;&#x662F; IsPalindrome &#x51FD;&#x6578;&#x5C0D;&#x61C9;&#x7684;&#x793A;&#x4F8B;&#x51FD;&#x6578;:</p>
<pre><code class="lang-Go"><span class="hljs-keyword">func</span> ExampleIsPalindrome() {
fmt.Println(IsPalindrome(<span class="hljs-string">&quot;A man, a plan, a canal: Panama&quot;</span>))
fmt.Println(IsPalindrome(<span class="hljs-string">&quot;palindrome&quot;</span>))
@@ -2069,10 +2033,10 @@
<span class="hljs-comment">// false</span>
}
</code></pre>
<p>&#x793A;&#x4F8B;&#x51FD;&#x6578;&#x6709;&#x4E09;&#x500B;&#x7528;&#x8655;. &#x6700;&#x4E3B;&#x8981;&#x7684;&#x4E00;&#x500B;&#x662F;&#x7528;&#x65BC;&#x6587;&#x6A94;: &#x4E00;&#x500B;&#x5305;&#x7684;&#x4F8B;&#x5B50;&#x53EF;&#x4EE5;&#x66F4;&#x7C21;&#x6F54;&#x76F4;&#x89C0;&#x7684;&#x65B9;&#x5F0F;&#x4F86;&#x6F14;&#x793A;&#x51FD;&#x6578;&#x7684;&#x7528;&#x6CD5;, &#x6703;&#x6587;&#x5B57;&#x63CF;&#x8FF0;&#x6703;&#x66F4;&#x76F4;&#x63A5;&#x6613;&#x61C2;, &#x7279;&#x5225;&#x662F;&#x4F5C;&#x70BA;&#x4E00;&#x500B;&#x63D0;&#x9192;&#x6216;&#x5FEB;&#x901F;&#x53C3;&#x8003;&#x6642;. &#x4E00;&#x500B;&#x4F8B;&#x5B50;&#x51FD;&#x6578;&#x4E5F;&#x53EF;&#x4EE5;&#x65B9;&#x4FBF;&#x5C55;&#x793A;&#x5C6C;&#x65BC;&#x8855;&#x4E00;&#x500B;&#x63A5;&#x53E3;&#x7684;&#x5E7E;&#x7A2E;&#x985E;&#x578B;&#x6216;&#x51FD;&#x6578;&#x76F4;&#x63A5;&#x7684;&#x95DC;&#x7E6B;, &#x6240;&#x6709;&#x7684;&#x6587;&#x6A94;&#x90FD;&#x5FC5;&#x9808;&#x95DC;&#x806F;&#x5230;&#x4E00;&#x500B;&#x5730;&#x65B9;, &#x5C31;&#x50CF;&#x4E00;&#x500B;&#x985E;&#x578B;&#x6216;&#x51FD;&#x6578;&#x8072;&#x660E;&#x90FD;&#x7D71;&#x4E00;&#x5230;&#x5305;&#x4E00;&#x6A23;. &#x8855;&#x6642;, &#x793A;&#x4F8B;&#x51FD;&#x6578;&#x548C;&#x8A3B;&#x91CB;&#x4E26;&#x4E0D;&#x4E00;&#x6A23;, &#x793A;&#x4F8B;&#x51FD;&#x6578;&#x662F;&#x5B8C;&#x6574;&#x771E;&#x662F;&#x7684;Go&#x4EE3;&#x78BC;, &#x9700;&#x8981;&#x4ECB;&#x7D39;&#x7DE8;&#x8B6F;&#x5668;&#x7684;&#x7DE8;&#x8B6F;&#x6642;&#x6AA2;&#x67FB;, &#x9019;&#x6A23;&#x53EF;&#x4EE5;&#x4FDD;&#x8A3C;&#x793A;&#x4F8B;&#x4EE3;&#x78BC;&#x4E0D;&#x6703;&#x8150;&#x721B;&#x6210;&#x4E0D;&#x80FD;&#x4F7F;&#x7528;&#x7684;&#x820A;&#x4EE3;&#x78BC;.</p>
<p>&#x793A;&#x4F8B;&#x51FD;&#x6578;&#x6709;&#x4E09;&#x500B;&#x7528;&#x8655;. &#x6700;&#x4E3B;&#x8981;&#x7684;&#x4E00;&#x500B;&#x662F;&#x7528;&#x65BC;&#x6587;&#x6A94;: &#x4E00;&#x500B;&#x5305;&#x7684;&#x4F8B;&#x5B50;&#x53EF;&#x4EE5;&#x66F4;&#x7C21;&#x6F54;&#x76F4;&#x89C0;&#x7684;&#x65B9;&#x5F0F;&#x4F86;&#x6F14;&#x793A;&#x51FD;&#x6578;&#x7684;&#x7528;&#x6CD5;, &#x6703;&#x6587;&#x5B57;&#x63CF;&#x8FF0;&#x6703;&#x66F4;&#x76F4;&#x63A5;&#x6613;&#x61C2;, &#x7279;&#x522B;&#x662F;&#x4F5C;&#x7232;&#x4E00;&#x500B;&#x63D0;&#x9192;&#x6216;&#x5FEB;&#x901F;&#x53C3;&#x8003;&#x6642;. &#x4E00;&#x500B;&#x4F8B;&#x5B50;&#x51FD;&#x6578;&#x4E5F;&#x53EF;&#x4EE5;&#x65B9;&#x4FBF;&#x5C55;&#x793A;&#x5C6C;&#x65BC;&#x540C;&#x4E00;&#x500B;&#x63A5;&#x53E3;&#x7684;&#x5E7E;&#x7A2E;&#x985E;&#x578B;&#x6216;&#x51FD;&#x6578;&#x76F4;&#x63A5;&#x7684;&#x95DC;&#x7E6B;, &#x6240;&#x6709;&#x7684;&#x6587;&#x6A94;&#x90FD;&#x5FC5;&#x9B1A;&#x95DC;&#x806F;&#x5230;&#x4E00;&#x500B;&#x5730;&#x65B9;, &#x5C31;&#x50CF;&#x4E00;&#x500B;&#x985E;&#x578B;&#x6216;&#x51FD;&#x6578;&#x8072;&#x660E;&#x90FD;&#x7D71;&#x4E00;&#x5230;&#x5305;&#x4E00;&#x6A23;. &#x540C;&#x6642;, &#x793A;&#x4F8B;&#x51FD;&#x6578;&#x548C;&#x8A3B;&#x91CB;&#x4F75;&#x4E0D;&#x4E00;&#x6A23;, &#x793A;&#x4F8B;&#x51FD;&#x6578;&#x662F;&#x5B8C;&#x6574;&#x771E;&#x662F;&#x7684;Go&#x4EE3;&#x78BC;, &#x9700;&#x8981;&#x4ECB;&#x7D39;&#x7DE8;&#x8B6F;&#x5668;&#x7684;&#x7DE8;&#x8B6F;&#x6642;&#x6AA2;&#x67FB;, &#x9019;&#x6A23;&#x53EF;&#x4EE5;&#x4FDD;&#x8B49;&#x793A;&#x4F8B;&#x4EE3;&#x78BC;&#x4E0D;&#x6703;&#x8150;&#x721B;&#x6210;&#x4E0D;&#x80FD;&#x4F7F;&#x7528;&#x7684;&#x820A;&#x4EE3;&#x78BC;.</p>
<p>&#x6839;&#x64DA;&#x793A;&#x4F8B;&#x51FD;&#x6578;&#x7684;&#x5F8C;&#x7DB4;&#x540D;&#x90E8;&#x5206;, godoc &#x7684;web&#x6587;&#x6A94;&#x6703;&#x5C07;&#x4E00;&#x500B;&#x793A;&#x4F8B;&#x51FD;&#x6578;&#x95DC;&#x806F;&#x5230;&#x67D0;&#x500B;&#x5177;&#x9AD4;&#x51FD;&#x6578;&#x6216;&#x5305;&#x672C;&#x8EAB;, &#x56E0;&#x6B64; ExampleIsPalindrome &#x793A;&#x4F8B;&#x51FD;&#x6578;&#x5C07;&#x662F; IsPalindrome &#x51FD;&#x6578;&#x6587;&#x6A94;&#x7684;&#x4E00;&#x90E8;&#x5206;, Example &#x793A;&#x4F8B;&#x51FD;&#x6578;&#x5C07;&#x662F;&#x5305;&#x6587;&#x6A94;&#x7684;&#x4E00;&#x90E8;&#x5206;.</p>
<p>&#x793A;&#x4F8B;&#x6587;&#x6A94;&#x7684;&#x7B2C;&#x4E8C;&#x500B;&#x7528;&#x8655;&#x662F;&#x5728; <code>go test</code> &#x57F7;&#x884C;&#x6E2C;&#x8A66;&#x7684;&#x6642;&#x5019;&#x4E5F;&#x904B;&#x884C;&#x793A;&#x4F8B;&#x51FD;&#x6578;&#x6E2C;&#x8A66;. &#x5982;&#x679C;&#x793A;&#x4F8B;&#x51FD;&#x6578;&#x5167;&#x542B;&#x6709;&#x985E;&#x4F3C;&#x4E0A;&#x9EAB;&#x4F8B;&#x5B50;&#x4E2D;&#x7684; <code>/ Output:</code> &#x9019;&#x6A23;&#x7684;&#x8A3B;&#x91CB;, &#x90A3;&#x9EBC;&#x6E2C;&#x8A66;&#x5DE5;&#x5177;&#x6703;&#x57F7;&#x884C;&#x9019;&#x500B;&#x793A;&#x4F8B;&#x51FD;&#x6578;, &#x7136;&#x5F8C;&#x6AA2;&#x6E2C;&#x9019;&#x500B;&#x793A;&#x4F8B;&#x51FD;&#x6578;&#x7684;&#x6A19;&#x6E96;&#x8F38;&#x9F63;&#x548C;&#x8A3B;&#x91CB;&#x662F;&#x5426;&#x5339;&#x914D;.</p>
<p>&#x793A;&#x4F8B;&#x51FD;&#x6578;&#x7684;&#x7B2C;&#x4E09;&#x500B;&#x76EE;&#x7684;&#x63D0;&#x4F9B;&#x4E00;&#x500B;&#x771E;&#x5BE6;&#x7684;&#x6F14;&#x7DF4;&#x5834;. golang.org &#x662F;&#x7531; dogoc &#x63D0;&#x4F9B;&#x7684;&#x670D;&#x52D9;, &#x5B83;&#x4F7F;&#x7528;&#x4E86; Go Playground &#x6280;&#x672E;&#x8B93;&#x7528;&#x6236;&#x53EF;&#x4EE5;&#x5728;&#x700F;&#x89BD;&#x5668;&#x4E2D;&#x5728;&#x7DAB;&#x7DE8;&#x8F2F;&#x548C;&#x904B;&#x884C;&#x6BCF;&#x500B;&#x793A;&#x4F8B;&#x51FD;&#x6578;, &#x5C31;&#x50CF; &#x5716; 11.4 &#x6240;&#x793A;&#x7684;&#x90A3;&#x6A23;. &#x9019;&#x901A;&#x5E38;&#x662F;&#x5B78;&#x7FD2;&#x51FD;&#x6578;&#x4F7F;&#x7528;&#x6216;Go&#x8A9E;&#x8A00;&#x7279;&#x6027;&#x7684;&#x6700;&#x5FEB;&#x65B9;&#x5F0F;.</p>
<p>&#x793A;&#x4F8B;&#x6587;&#x6A94;&#x7684;&#x7B2C;&#x4E8C;&#x500B;&#x7528;&#x8655;&#x662F;&#x5728; <code>go test</code> &#x57F7;&#x884C;&#x6E2C;&#x8A66;&#x7684;&#x6642;&#x5019;&#x4E5F;&#x904B;&#x884C;&#x793A;&#x4F8B;&#x51FD;&#x6578;&#x6E2C;&#x8A66;. &#x5982;&#x679C;&#x793A;&#x4F8B;&#x51FD;&#x6578;&#x5167;&#x542B;&#x6709;&#x985E;&#x4F3C;&#x4E0A;&#x9762;&#x4F8B;&#x5B50;&#x4E2D;&#x7684; <code>/ Output:</code> &#x9019;&#x6A23;&#x7684;&#x8A3B;&#x91CB;, &#x90A3;&#x9EBD;&#x6E2C;&#x8A66;&#x5DE5;&#x5177;&#x6703;&#x57F7;&#x884C;&#x9019;&#x500B;&#x793A;&#x4F8B;&#x51FD;&#x6578;, &#x7136;&#x5F8C;&#x6AA2;&#x6E2C;&#x9019;&#x500B;&#x793A;&#x4F8B;&#x51FD;&#x6578;&#x7684;&#x6A19;&#x6E96;&#x8F38;&#x9F63;&#x548C;&#x8A3B;&#x91CB;&#x662F;&#x5426;&#x5339;&#x914D;.</p>
<p>&#x793A;&#x4F8B;&#x51FD;&#x6578;&#x7684;&#x7B2C;&#x4E09;&#x500B;&#x76EE;&#x7684;&#x63D0;&#x4F9B;&#x4E00;&#x500B;&#x771E;&#x5BE6;&#x7684;&#x6F14;&#x7DF4;&#x5834;. golang.org &#x662F;&#x7531; dogoc &#x63D0;&#x4F9B;&#x7684;&#x670D;&#x52D9;, &#x5B83;&#x4F7F;&#x7528;&#x4E86; Go Playground &#x6280;&#x8853;&#x8B93;&#x7528;&#x6236;&#x53EF;&#x4EE5;&#x5728;&#x700F;&#x89BD;&#x5668;&#x4E2D;&#x5728;&#x7DDA;&#x7DE8;&#x8F2F;&#x548C;&#x904B;&#x884C;&#x6BCF;&#x500B;&#x793A;&#x4F8B;&#x51FD;&#x6578;, &#x5C31;&#x50CF; &#x5716; 11.4 &#x6240;&#x793A;&#x7684;&#x90A3;&#x6A23;. &#x9019;&#x901A;&#x5E38;&#x662F;&#x5B78;&#x7FD2;&#x51FD;&#x6578;&#x4F7F;&#x7528;&#x6216;Go&#x8A9E;&#x8A00;&#x7279;&#x6027;&#x7684;&#x6700;&#x5FEB;&#x65B9;&#x5F0F;.</p>
<p><img src="../images/ch11-04.png" alt=""></p>
<p>&#x672C;&#x66F8;&#x6700;&#x5F8C;&#x7684;&#x5169;&#x638C;&#x662F;&#x8A0E;&#x8AD6; reflect &#x548C; unsafe &#x5305;, &#x4E00;&#x822C;&#x7684;Go&#x7528;&#x65BC;&#x5F88;&#x5C11;&#x9700;&#x8981;&#x4F7F;&#x7528;&#x5B83;&#x5011;. &#x56E0;&#x6B64;, &#x5982;&#x679C;&#x4F60;&#x9084;&#x6C92;&#x6709;&#x5BEB;&#x904E;&#x4EFB;&#x4F55;&#x771E;&#x662F;&#x7684;Go&#x7A0B;&#x5E8F;&#x7684;&#x8A71;, &#x73FE;&#x5728;&#x53EF;&#x4EE5;&#x5FFD;&#x7565;&#x5269;&#x9918;&#x90E8;&#x5206;&#x800C;&#x76F4;&#x63A5;&#x7DE8;&#x78BC;&#x4E86;.</p>

View File

@@ -48,7 +48,7 @@
<body>
<div class="book" data-level="11" data-chapter-title="測試" data-filepath="ch11/ch11.md" data-basepath=".." data-revision="Wed Dec 16 2015 10:54:29 GMT+0800 (中国标准时间)">
<div class="book" data-level="11" data-chapter-title="測試" data-filepath="ch11/ch11.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,12 +2024,12 @@
<section class="normal" id="section-">
<h1 id="&#x7B2C;&#x5341;&#x4E00;&#x7AE0;-&#x6E2C;&#x8A66;">&#x7B2C;&#x5341;&#x4E00;&#x7AE0; &#x6E2C;&#x8A66;</h1>
<p>Maurice Wilkes, &#x7B2C;&#x4E00;&#x500B;&#x5B58;&#x5132;&#x7A0B;&#x5E8F;&#x8A08;&#x7B97;&#x6A5F; EDSAC &#x7684;&#x8A2D;&#x8A08;&#x8005;, 1949&#x5E74;&#x5728;&#x4ED6;&#x7684;&#x5BE6;&#x9A57;&#x5BA4;&#x722C;&#x6A13;&#x68AF;&#x6642;&#x6709;&#x4E00;&#x500B;&#x9813;&#x609F;. &#x5728;&#x300A;&#x8A08;&#x7B97;&#x6A5F;&#x5148;&#x9A45;&#x8FF4;&#x61B6;&#x5F54;&#x300B;(Memoirs of a Computer Pioneer)&#x88CF;, &#x4ED6;&#x8FF4;&#x61B6;&#x5230;: &quot;&#x5FFD;&#x7136;&#x9593;&#x6709;&#x4E00;&#x7A2E;&#x918D;&#x9190;&#x704C;&#x9802;&#x7684;&#x611F;&#x89BA;, &#x6211;&#x6574;&#x500B;&#x5F8C;&#x534A;&#x751F;&#x7684;&#x7F8E;&#x597D;&#x6642;&#x5149;&#x90FD;&#x5C07;&#x5728;&#x5C0B;&#x627E;&#x7A0B;&#x5E8F;BUG&#x4E2D;&#x5EA6;&#x904E;&#x4E86;.&quot;. &#x80AF;&#x5B9A;&#x5F9E;&#x90A3;&#x4E4B;&#x5F8C;&#x7684;&#x6BCF;&#x4E00;&#x500B;&#x5B58;&#x5132;&#x7A0B;&#x5E8F;&#x7684;&#x78BC;&#x8FB2;&#x90FD;&#x53EF;&#x4EE5;&#x8855;&#x60C5; Wilkes &#x7684;&#x60F3;&#x6CD5;, &#x96D6;&#x7136;&#x4E5F;&#x8A31;&#x4E0D;&#x662F;&#x6C92;&#x6709;&#x4EBA;&#x774F;&#x60D1;&#x65BC;&#x4ED6;&#x5C0D;&#x8EDF;&#x4EF6;&#x958B;&#x9AEE;&#x7684;&#x96E3;&#x5EA6;&#x7684;&#x5929;&#x771E;&#x770B;&#x6CD5;.</p>
<p>&#x73FE;&#x5728;&#x7684;&#x7A0B;&#x5E8F;&#x5DF2;&#x7D93;&#x9060;&#x6BD4; Wilkes &#x6642;&#x4EE3;&#x7684;&#x66F4;&#x5927;&#x4E5F;&#x66F4;&#x5FA9;&#x96DC;, &#x4E5F;&#x6709;&#x8A31;&#x591A;&#x6280;&#x672E;&#x53EF;&#x4EE5;&#x8B93;&#x8EDF;&#x4EF6;&#x7684;&#x5FA9;&#x96DC;&#x6027;&#x53EF;&#x5F97;&#x5230;&#x63A7;&#x88FD;. &#x5176;&#x4E2D;&#x6709;&#x5169;&#x7A2E;&#x6280;&#x672E;&#x5728;&#x5BE6;&#x8E10;&#x4E2D;&#x8B49;&#x660E;&#x662F;&#x6BD4;&#x8F03;&#x6709;&#x6548;&#x7684;. &#x7B2C;&#x4E00;&#x7A2E;&#x662F;&#x4EE3;&#x78BC;&#x5728;&#x88AB;&#x6B63;&#x5F0F;&#x90E8;&#x7F72;&#x524D;&#x9700;&#x8981;&#x9032;&#x884C;&#x4EE3;&#x78BC;&#x8A55;&#x5BE9;. &#x7B2C;&#x4E8C;&#x7A2E;&#x662F;&#x6E2C;&#x8A66;, &#x662F;&#x672C;&#x7AE0;&#x7684;&#x8A0E;&#x8AD6;&#x4E3B;&#x984C;.</p>
<p>&#x6211;&#x5011;&#x8AAA;&#x6E2C;&#x8A66;&#x7684;&#x6642;&#x5019;&#x4E00;&#x822C;&#x662F;&#x6307;&#x81EA;&#x52D5;&#x5316;&#x6E2C;&#x8A66;, &#x4E5F;&#x5C31;&#x662F;&#x5BEB;&#x4E00;&#x4E9B;&#x5C0F;&#x7684;&#x7A0B;&#x5E8F;&#x7528;&#x4F86;&#x6AA2;&#x6E2C;&#x88AB;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;(&#x7522;&#x54C1;&#x4EE3;&#x78BC;)&#x7684;&#x884C;&#x70BA;&#x548C;&#x9810;&#x671F;&#x7684;&#x4E00;&#x6A23;, &#x9019;&#x4E9B;&#x901A;&#x5E38;&#x90FD;&#x662F;&#x7CBE;&#x5FC3;&#x6311;&#x9078;&#x7684;&#x57F7;&#x884C;&#x67D0;&#x4E9B;&#x7279;&#x5B9A;&#x7684;&#x529F;&#x80FD;&#x6216;&#x8005;&#x662F;&#x901A;&#x904E;&#x96A8;&#x6A5F;&#x6027;&#x7684;&#x8F38;&#x5165;&#x8981;&#x9A57;&#x8B49;&#x908A;&#x754C;&#x7684;&#x8655;&#x7406;.</p>
<p>&#x8EDF;&#x4EF6;&#x6E2C;&#x8A66;&#x662F;&#x4E00;&#x500B;&#x9245;&#x5927;&#x7684;&#x9818;&#x57DF;. &#x6E2C;&#x8A66;&#x7684;&#x4EFB;&#x52D9;&#x4E00;&#x822C;&#x4F54;&#x64DA;&#x4E86;&#x4E00;&#x4E9B;&#x7A0B;&#x5E8F;&#x54E1;&#x7684;&#x90E8;&#x5206;&#x6642;&#x9593;&#x548C;&#x53E6;&#x4E00;&#x4E9B;&#x7A0B;&#x5E8F;&#x54E1;&#x7684;&#x5168;&#x90E8;&#x6642;&#x9593;. &#x548C;&#x8EDF;&#x4EF6;&#x6E2C;&#x8A66;&#x6280;&#x672E;&#x76F8;&#x95DC;&#x7684;&#x5716;&#x66F8;&#x6216;&#x535A;&#x5BA2;&#x6587;&#x7AE0;&#x6709;&#x6210;&#x97C6;&#x4E0A;&#x842C;&#x4E4B;&#x591A;. &#x6BCF;&#x4E00;&#x7A2E;&#x4E3B;&#x6D41;&#x7684;&#x7DE8;&#x7A0B;&#x8A9E;&#x8A00;, &#x90FD;&#x6709;&#x4E00;&#x6253;&#x7684;&#x7528;&#x65BC;&#x6E2C;&#x8A66;&#x7684;&#x8EDF;&#x4EF6;&#x5305;, &#x4E5F;&#x6709;&#x5927;&#x91CF;&#x7684;&#x6E2C;&#x8A66;&#x76F8;&#x95DC;&#x7684;&#x7406;&#x8AD6;, &#x6BCF;&#x7A2E;&#x90FD;&#x5438;&#x5F15;&#x4E86;&#x5927;&#x91CF;&#x6280;&#x672E;&#x5148;&#x9A45;&#x548C;&#x8FFD;&#x96A8;&#x8005;. &#x9019;&#x4E9B;&#x90FD;&#x8DB3;&#x4EE5;&#x8AAA;&#x670D;&#x90A3;&#x4E9B;&#x60F3;&#x8981;&#x7DE8;&#x5BEB;&#x6709;&#x6548;&#x6E2C;&#x8A66;&#x7684;&#x7A0B;&#x5E8F;&#x54E1;&#x91CD;&#x65B0;&#x5B78;&#x7FD2;&#x4E00;&#x5957;&#x5168;&#x65B0;&#x7684;&#x6280;&#x80FD;.</p>
<p>Go&#x8A9E;&#x8A00;&#x7684;&#x6E2C;&#x8A66;&#x6280;&#x672E;&#x662F;&#x76F8;&#x5C0D;&#x4F4E;&#x7D1A;&#x7684;. &#x5B83;&#x4F9D;&#x8CF4;&#x4E00;&#x500B; &apos;go test&apos; &#x6E2C;&#x8A66;&#x547D;&#x4EE4;, &#x548C;&#x4E00;&#x7D44;&#x6309;&#x7167;&#x7D04;&#x5B9A;&#x65B9;&#x5F0F;&#x7DE8;&#x5BEB;&#x7684;&#x6E2C;&#x8A66;&#x51FD;&#x6578;, &#x6E2C;&#x8A66;&#x547D;&#x4EE4;&#x53EF;&#x4EE5;&#x904B;&#x884C;&#x6E2C;&#x8A66;&#x51FD;&#x6578;. &#x7DE8;&#x5BEB;&#x76F8;&#x5C0D;&#x8F15;&#x91CF;&#x7D1A;&#x7684;&#x7D14;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x662F;&#x6709;&#x6548;&#x7684;, &#x800C;&#x4E14;&#x5B83;&#x5F88;&#x5BB9;&#x6613;&#x5EF6;&#x4F38;&#x5230;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x548C;&#x793A;&#x4F8B;&#x6587;&#x6A94;.</p>
<p>&#x5728;&#x5BE6;&#x8E10;&#x4E2D;, &#x7DE8;&#x5BEB;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x548C;&#x7DE8;&#x5BEB;&#x7A0B;&#x5E8F;&#x672C;&#x8EAB;&#x4F75;&#x6C92;&#x6709;&#x591A;&#x5927;&#x5340;&#x5F46;. &#x6211;&#x5011;&#x7DE8;&#x5BEB;&#x7684;&#x6BCF;&#x4E00;&#x500B;&#x51FD;&#x6578;&#x4E5F;&#x662F;&#x937C;&#x5C0D;&#x6BCF;&#x500B;&#x5177;&#x9AD4;&#x7684;&#x4EFB;&#x52D9;. &#x6211;&#x5011;&#x5FC5;&#x9B1A;&#x5C0F;&#x5FC3;&#x8655;&#x7406;&#x908A;&#x754C;&#x689D;&#x4EF6;, &#x601D;&#x8003;&#x95A4;&#x9069;&#x7684;&#x6578;&#x64DA;&#x7D50;&#x69CB;, &#x63A8;&#x65B7;&#x95A4;&#x9069;&#x7684;&#x8F38;&#x5165;&#x61C9;&#x8A72;&#x7522;&#x751F;&#x4EC0;&#x9EBC;&#x6A23;&#x7684;&#x7D50;&#x679C;&#x8F38;&#x9F63;. &#x7DE8;&#x7A0B;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x548C;&#x7DE8;&#x5BEB;&#x666E;&#x901A;&#x7684;Go&#x4EE3;&#x78BC;&#x904E;&#x7A0B;&#x662F;&#x985E;&#x4F3C;&#x7684;; &#x5B83;&#x4F75;&#x4E0D;&#x9700;&#x8981;&#x5B78;&#x7FD2;&#x65B0;&#x7684;&#x7B26;&#x865F;, &#x898F;&#x5247;&#x548C;&#x5DE5;&#x5177;.</p>
<p>Maurice Wilkes, &#x7B2C;&#x4E00;&#x500B;&#x5B58;&#x5132;&#x7A0B;&#x5E8F;&#x8A08;&#x7B97;&#x6A5F; EDSAC &#x7684;&#x8A2D;&#x8A08;&#x8005;, 1949&#x5E74;&#x5728;&#x4ED6;&#x7684;&#x5BE6;&#x9A57;&#x5BA4;&#x722C;&#x6A13;&#x68AF;&#x6642;&#x6709;&#x4E00;&#x500B;&#x9813;&#x609F;. &#x5728;&#x300A;&#x8A08;&#x7B97;&#x6A5F;&#x5148;&#x9A45;&#x8FF4;&#x61B6;&#x9332;&#x300B;(Memoirs of a Computer Pioneer)&#x91CC;, &#x4ED6;&#x8FF4;&#x61B6;&#x5230;: &quot;&#x5FFD;&#x7136;&#x9593;&#x6709;&#x4E00;&#x7A2E;&#x918D;&#x9190;&#x704C;&#x9802;&#x7684;&#x611F;&#x89BA;, &#x6211;&#x6574;&#x500B;&#x5F8C;&#x534A;&#x751F;&#x7684;&#x7F8E;&#x597D;&#x6642;&#x5149;&#x90FD;&#x5C07;&#x5728;&#x5C0B;&#x627E;&#x7A0B;&#x5E8F;BUG&#x4E2D;&#x5EA6;&#x904E;&#x4E86;.&quot;. &#x80AF;&#x5B9A;&#x5F9E;&#x90A3;&#x4E4B;&#x5F8C;&#x7684;&#x6BCF;&#x4E00;&#x500B;&#x5B58;&#x5132;&#x7A0B;&#x5E8F;&#x7684;&#x78BC;&#x8FB2;&#x90FD;&#x53EF;&#x4EE5;&#x540C;&#x60C5; Wilkes &#x7684;&#x60F3;&#x6CD5;, &#x96D6;&#x7136;&#x4E5F;&#x8A31;&#x4E0D;&#x662F;&#x6C92;&#x6709;&#x4EBA;&#x774F;&#x60D1;&#x65BC;&#x4ED6;&#x5C0D;&#x8EDF;&#x4EF6;&#x958B;&#x767C;&#x7684;&#x96E3;&#x5EA6;&#x7684;&#x5929;&#x771E;&#x770B;&#x6CD5;.</p>
<p>&#x73FE;&#x5728;&#x7684;&#x7A0B;&#x5E8F;&#x5DF2;&#x7D93;&#x9060;&#x6BD4; Wilkes &#x6642;&#x4EE3;&#x7684;&#x66F4;&#x5927;&#x4E5F;&#x66F4;&#x8907;&#x96DC;, &#x4E5F;&#x6709;&#x8A31;&#x591A;&#x6280;&#x8853;&#x53EF;&#x4EE5;&#x8B93;&#x8EDF;&#x4EF6;&#x7684;&#x8907;&#x96DC;&#x6027;&#x53EF;&#x5F97;&#x5230;&#x63A7;&#x88FD;. &#x5176;&#x4E2D;&#x6709;&#x5169;&#x7A2E;&#x6280;&#x8853;&#x5728;&#x5BE6;&#x8E10;&#x4E2D;&#x8B49;&#x660E;&#x662F;&#x6BD4;&#x8F03;&#x6709;&#x6548;&#x7684;. &#x7B2C;&#x4E00;&#x7A2E;&#x662F;&#x4EE3;&#x78BC;&#x5728;&#x88AB;&#x6B63;&#x5F0F;&#x90E8;&#x7F72;&#x524D;&#x9700;&#x8981;&#x9032;&#x884C;&#x4EE3;&#x78BC;&#x8A55;&#x5BE9;. &#x7B2C;&#x4E8C;&#x7A2E;&#x662F;&#x6E2C;&#x8A66;, &#x662F;&#x672C;&#x7AE0;&#x7684;&#x8A0E;&#x8AD6;&#x4E3B;&#x984C;.</p>
<p>&#x6211;&#x5011;&#x8AAC;&#x6E2C;&#x8A66;&#x7684;&#x6642;&#x5019;&#x4E00;&#x822C;&#x662F;&#x6307;&#x81EA;&#x52D5;&#x5316;&#x6E2C;&#x8A66;, &#x4E5F;&#x5C31;&#x662F;&#x5BEB;&#x4E00;&#x4E9B;&#x5C0F;&#x7684;&#x7A0B;&#x5E8F;&#x7528;&#x4F86;&#x6AA2;&#x6E2C;&#x88AB;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;(&#x7523;&#x54C1;&#x4EE3;&#x78BC;)&#x7684;&#x884C;&#x7232;&#x548C;&#x9810;&#x671F;&#x7684;&#x4E00;&#x6A23;, &#x9019;&#x4E9B;&#x901A;&#x5E38;&#x90FD;&#x662F;&#x7CBE;&#x5FC3;&#x6311;&#x9078;&#x7684;&#x57F7;&#x884C;&#x67D0;&#x4E9B;&#x7279;&#x5B9A;&#x7684;&#x529F;&#x80FD;&#x6216;&#x8005;&#x662F;&#x901A;&#x904E;&#x96A8;&#x6A5F;&#x6027;&#x7684;&#x8F38;&#x5165;&#x8981;&#x9A57;&#x8B49;&#x908A;&#x754C;&#x7684;&#x8655;&#x7406;.</p>
<p>&#x8EDF;&#x4EF6;&#x6E2C;&#x8A66;&#x662F;&#x4E00;&#x500B;&#x9245;&#x5927;&#x7684;&#x9818;&#x57DF;. &#x6E2C;&#x8A66;&#x7684;&#x4EFB;&#x52D9;&#x4E00;&#x822C;&#x5360;&#x64DA;&#x4E86;&#x4E00;&#x4E9B;&#x7A0B;&#x5E8F;&#x54E1;&#x7684;&#x90E8;&#x5206;&#x6642;&#x9593;&#x548C;&#x53E6;&#x4E00;&#x4E9B;&#x7A0B;&#x5E8F;&#x54E1;&#x7684;&#x5168;&#x90E8;&#x6642;&#x9593;. &#x548C;&#x8EDF;&#x4EF6;&#x6E2C;&#x8A66;&#x6280;&#x8853;&#x76F8;&#x95DC;&#x7684;&#x5716;&#x66F8;&#x6216;&#x535A;&#x5BA2;&#x6587;&#x7AE0;&#x6709;&#x6210;&#x97C6;&#x4E0A;&#x842C;&#x4E4B;&#x591A;. &#x6BCF;&#x4E00;&#x7A2E;&#x4E3B;&#x6D41;&#x7684;&#x7DE8;&#x7A0B;&#x8A9E;&#x8A00;, &#x90FD;&#x6709;&#x4E00;&#x6253;&#x7684;&#x7528;&#x65BC;&#x6E2C;&#x8A66;&#x7684;&#x8EDF;&#x4EF6;&#x5305;, &#x4E5F;&#x6709;&#x5927;&#x91CF;&#x7684;&#x6E2C;&#x8A66;&#x76F8;&#x95DC;&#x7684;&#x7406;&#x8AD6;, &#x6BCF;&#x7A2E;&#x90FD;&#x5438;&#x5F15;&#x4E86;&#x5927;&#x91CF;&#x6280;&#x8853;&#x5148;&#x9A45;&#x548C;&#x8FFD;&#x96A8;&#x8005;. &#x9019;&#x4E9B;&#x90FD;&#x8DB3;&#x4EE5;&#x8AAC;&#x670D;&#x90A3;&#x4E9B;&#x60F3;&#x8981;&#x7DE8;&#x5BEB;&#x6709;&#x6548;&#x6E2C;&#x8A66;&#x7684;&#x7A0B;&#x5E8F;&#x54E1;&#x91CD;&#x65B0;&#x5B78;&#x7FD2;&#x4E00;&#x5957;&#x5168;&#x65B0;&#x7684;&#x6280;&#x80FD;.</p>
<p>Go&#x8A9E;&#x8A00;&#x7684;&#x6E2C;&#x8A66;&#x6280;&#x8853;&#x662F;&#x76F8;&#x5C0D;&#x4F4E;&#x7D1A;&#x7684;. &#x5B83;&#x4F9D;&#x8CF4;&#x4E00;&#x500B; &apos;go test&apos; &#x6E2C;&#x8A66;&#x547D;&#x4EE4;, &#x548C;&#x4E00;&#x7D44;&#x6309;&#x7167;&#x7D04;&#x5B9A;&#x65B9;&#x5F0F;&#x7DE8;&#x5BEB;&#x7684;&#x6E2C;&#x8A66;&#x51FD;&#x6578;, &#x6E2C;&#x8A66;&#x547D;&#x4EE4;&#x53EF;&#x4EE5;&#x904B;&#x884C;&#x6E2C;&#x8A66;&#x51FD;&#x6578;. &#x7DE8;&#x5BEB;&#x76F8;&#x5C0D;&#x8F15;&#x91CF;&#x7D1A;&#x7684;&#x7D14;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x662F;&#x6709;&#x6548;&#x7684;, &#x800C;&#x4E14;&#x5B83;&#x5F88;&#x5BB9;&#x6613;&#x5EF6;&#x4F38;&#x5230;&#x57FA;&#x6E96;&#x6E2C;&#x8A66;&#x548C;&#x793A;&#x4F8B;&#x6587;&#x6A94;.</p>
<p>&#x5728;&#x5BE6;&#x8E10;&#x4E2D;, &#x7DE8;&#x5BEB;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x548C;&#x7DE8;&#x5BEB;&#x7A0B;&#x5E8F;&#x672C;&#x8EAB;&#x4F75;&#x6C92;&#x6709;&#x591A;&#x5927;&#x5340;&#x522B;. &#x6211;&#x5011;&#x7DE8;&#x5BEB;&#x7684;&#x6BCF;&#x4E00;&#x500B;&#x51FD;&#x6578;&#x4E5F;&#x662F;&#x91DD;&#x5C0D;&#x6BCF;&#x500B;&#x5177;&#x9AD4;&#x7684;&#x4EFB;&#x52D9;. &#x6211;&#x5011;&#x5FC5;&#x9B1A;&#x5C0F;&#x5FC3;&#x8655;&#x7406;&#x908A;&#x754C;&#x689D;&#x4EF6;, &#x601D;&#x8003;&#x5408;&#x9069;&#x7684;&#x6578;&#x64DA;&#x7D50;&#x69CB;, &#x63A8;&#x65B7;&#x5408;&#x9069;&#x7684;&#x8F38;&#x5165;&#x61C9;&#x8A72;&#x7523;&#x751F;&#x4EC0;&#x9EBD;&#x6A23;&#x7684;&#x7D50;&#x679C;&#x8F38;&#x9F63;. &#x7DE8;&#x7A0B;&#x6E2C;&#x8A66;&#x4EE3;&#x78BC;&#x548C;&#x7DE8;&#x5BEB;&#x666E;&#x901A;&#x7684;Go&#x4EE3;&#x78BC;&#x904E;&#x7A0B;&#x662F;&#x985E;&#x4F3C;&#x7684;; &#x5B83;&#x4F75;&#x4E0D;&#x9700;&#x8981;&#x5B78;&#x7FD2;&#x65B0;&#x7684;&#x7B26;&#x865F;, &#x898F;&#x5247;&#x548C;&#x5DE5;&#x5177;.</p>
</section>