This commit is contained in:
chai2010
2015-12-28 16:08:26 +08:00
parent 35b11c0ff4
commit 775502e64d
206 changed files with 2064 additions and 1460 deletions

View File

@@ -21,6 +21,10 @@
<link rel="stylesheet" href="../gitbook/style.css">
<link rel="stylesheet" href="../gitbook/plugins/gitbook-plugin-katex/katex.min.css">
<link rel="stylesheet" href="../gitbook/plugins/gitbook-plugin-highlight/website.css">
@@ -44,7 +48,7 @@
<body>
<div class="book" data-level="8.10" data-chapter-title="示例: 聊天服務" data-filepath="ch8/ch8-10.md" data-basepath=".." data-revision="Fri Dec 25 2015 12:32:44 GMT+0800 (中国标准时间)">
<div class="book" data-level="8.10" data-chapter-title="示例: 聊天服務" data-filepath="ch8/ch8-10.md" data-basepath=".." data-revision="Mon Dec 28 2015 16:03:52 GMT+0800 (中国标准时间)">
<div class="book-summary">
@@ -238,7 +242,7 @@
<b>1.5.</b>
取URL
取URL
</a>
@@ -253,7 +257,7 @@
<b>1.6.</b>
併發取多個URL
併發取多個URL
</a>
@@ -802,7 +806,7 @@
<b>5.10.</b>
Recover捕異常
Recover捕異常
</a>
@@ -1315,7 +1319,7 @@
<b>8.9.</b>
併發的退
併發的退
</a>
@@ -1834,7 +1838,7 @@
<b>12.7.</b>
取結構體字段標識
取結構體字段標識
</a>
@@ -2039,7 +2043,7 @@
}
}
</code></pre>
<p>&#x7136;&#x5F8C;&#x662F;broadcaster&#x7684;goroutine&#x3002;&#x4ED6;&#x7684;&#x5167;&#x90E8;&#x8B8A;&#x91CF;clients&#x6703;&#x8A18;&#x9332;&#x7576;&#x524D;&#x5EFA;&#x7ACB;&#x9023;&#x63A5;&#x7684;&#x5BA2;&#x6236;&#x7AEF;&#x96C6;&#x5408;&#x3002;&#x5176;&#x8A18;&#x9332;&#x7684;&#x5167;&#x5BB9;&#x662F;&#x6BCF;&#x4E00;&#x500B;&#x5BA2;&#x6236;&#x7AEF;&#x7684;&#x6D88;&#x606F;&#x767C;&#x9F63;channel&#x7684;&quot;&#x8CC7;&#x683C;&quot;&#x4FE1;&#x606F;&#x3002;</p>
<p>&#x7136;&#x5F8C;&#x662F;broadcaster&#x7684;goroutine&#x3002;&#x4ED6;&#x7684;&#x5167;&#x90E8;&#x8B8A;&#x91CF;clients&#x6703;&#x8A18;&#x9332;&#x7576;&#x524D;&#x5EFA;&#x7ACB;&#x9023;&#x63A5;&#x7684;&#x5BA2;&#x6236;&#x7AEF;&#x96C6;&#x5408;&#x3002;&#x5176;&#x8A18;&#x9332;&#x7684;&#x5167;&#x5BB9;&#x662F;&#x6BCF;&#x4E00;&#x500B;&#x5BA2;&#x6236;&#x7AEF;&#x7684;&#x6D88;&#x606F;&#x767C;&#x51FA;channel&#x7684;&quot;&#x8CC7;&#x683C;&quot;&#x4FE1;&#x606F;&#x3002;</p>
<pre><code class="lang-go"><span class="hljs-keyword">type</span> client <span class="hljs-keyword">chan</span>&lt;- <span class="hljs-typename">string</span> <span class="hljs-comment">// an outgoing message channel</span>
<span class="hljs-keyword">var</span> (
@@ -2068,8 +2072,8 @@
}
}
</code></pre>
<p>broadcaster&#x76E3;&#x807D;&#x4F86;&#x81EA;&#x5168;&#x5C40;&#x7684;entering&#x548C;leaving&#x7684;channel&#x4F86;&#x7A6B;&#x77E5;&#x5BA2;&#x6236;&#x7AEF;&#x7684;&#x5230;&#x4F86;&#x548C;&#x96E2;&#x958B;&#x4E8B;&#x4EF6;&#x3002;&#x7576;&#x5176;&#x63A5;&#x6536;&#x5230;&#x5176;&#x4E2D;&#x7684;&#x4E00;&#x500B;&#x4E8B;&#x4EF6;&#x6642;&#xFF0C;&#x6703;&#x66F4;&#x65B0;clients&#x96C6;&#x5408;&#xFF0C;&#x7576;&#x8A72;&#x4E8B;&#x4EF6;&#x662F;&#x96E2;&#x958B;&#x884C;&#x7232;&#x6642;&#xFF0C;&#x5B83;&#x6703;&#x95DC;&#x9589;&#x5BA2;&#x6236;&#x7AEF;&#x7684;&#x6D88;&#x606F;&#x767C;&#x9F63;channel&#x3002;broadcaster&#x4E5F;&#x6703;&#x76E3;&#x807D;&#x5168;&#x5C40;&#x7684;&#x6D88;&#x606F;channel&#xFF0C;&#x6240;&#x6709;&#x7684;&#x5BA2;&#x6236;&#x7AEF;&#x90FD;&#x6703;&#x5411;&#x9019;&#x500B;channel&#x4E2D;&#x767C;&#x9001;&#x6D88;&#x606F;&#x3002;&#x7576;broadcaster&#x63A5;&#x6536;&#x5230;&#x4EC0;&#x9EBD;&#x6D88;&#x606F;&#x6642;&#xFF0C;&#x5C31;&#x6703;&#x5C07;&#x5176;&#x5EE3;&#x64AD;&#x81F3;&#x6240;&#x6709;&#x9023;&#x63A5;&#x5230;&#x670D;&#x52D9;&#x7AEF;&#x7684;&#x5BA2;&#x6236;&#x7AEF;&#x3002;</p>
<p>&#x73FE;&#x5728;&#x8B93;&#x6211;&#x5011;&#x770B;&#x770B;&#x6BCF;&#x4E00;&#x500B;&#x5BA2;&#x6236;&#x7AEF;&#x7684;goroutine&#x3002;handleConn&#x51FD;&#x6578;&#x6703;&#x7232;&#x5B83;&#x7684;&#x5BA2;&#x6236;&#x7AEF;&#x5275;&#x5EFA;&#x4E00;&#x500B;&#x6D88;&#x606F;&#x767C;&#x9F63;channel&#x4F75;&#x901A;&#x904E;entering channel&#x4F86;&#x901A;&#x77E5;&#x5BA2;&#x6236;&#x7AEF;&#x7684;&#x5230;&#x4F86;&#x3002;&#x7136;&#x5F8C;&#x5B83;&#x6703;&#x8B80;&#x53D6;&#x5BA2;&#x6236;&#x7AEF;&#x767C;&#x4F86;&#x7684;&#x6BCF;&#x4E00;&#x884C;&#x6587;&#x672C;&#xFF0C;&#x4F75;&#x901A;&#x904E;&#x5168;&#x5C40;&#x7684;&#x6D88;&#x606F;channel&#x4F86;&#x5C07;&#x9019;&#x4E9B;&#x6587;&#x672C;&#x767C;&#x9001;&#x9F63;&#x53BB;&#xFF0C;&#x4F75;&#x7232;&#x6BCF;&#x689D;&#x6D88;&#x606F;&#x5E36;&#x4E0A;&#x767C;&#x9001;&#x8005;&#x7684;&#x524D;&#x7DB4;&#x4F86;&#x6A19;&#x660E;&#x6D88;&#x606F;&#x8EAB;&#x4EFD;&#x3002;&#x7576;&#x5BA2;&#x6236;&#x7AEF;&#x767C;&#x9001;&#x5B8C;&#x7562;&#x5F8C;&#xFF0C;handleConn&#x6703;&#x901A;&#x904E;leaving&#x9019;&#x500B;channel&#x4F86;&#x901A;&#x77E5;&#x5BA2;&#x6236;&#x7AEF;&#x7684;&#x96E2;&#x958B;&#x4F75;&#x95DC;&#x9589;&#x9023;&#x63A5;&#x3002;</p>
<p>broadcaster&#x76E3;&#x807D;&#x4F86;&#x81EA;&#x5168;&#x5C40;&#x7684;entering&#x548C;leaving&#x7684;channel&#x4F86;&#x7372;&#x77E5;&#x5BA2;&#x6236;&#x7AEF;&#x7684;&#x5230;&#x4F86;&#x548C;&#x96E2;&#x958B;&#x4E8B;&#x4EF6;&#x3002;&#x7576;&#x5176;&#x63A5;&#x6536;&#x5230;&#x5176;&#x4E2D;&#x7684;&#x4E00;&#x500B;&#x4E8B;&#x4EF6;&#x6642;&#xFF0C;&#x6703;&#x66F4;&#x65B0;clients&#x96C6;&#x5408;&#xFF0C;&#x7576;&#x8A72;&#x4E8B;&#x4EF6;&#x662F;&#x96E2;&#x958B;&#x884C;&#x7232;&#x6642;&#xFF0C;&#x5B83;&#x6703;&#x95DC;&#x9589;&#x5BA2;&#x6236;&#x7AEF;&#x7684;&#x6D88;&#x606F;&#x767C;&#x51FA;channel&#x3002;broadcaster&#x4E5F;&#x6703;&#x76E3;&#x807D;&#x5168;&#x5C40;&#x7684;&#x6D88;&#x606F;channel&#xFF0C;&#x6240;&#x6709;&#x7684;&#x5BA2;&#x6236;&#x7AEF;&#x90FD;&#x6703;&#x5411;&#x9019;&#x500B;channel&#x4E2D;&#x767C;&#x9001;&#x6D88;&#x606F;&#x3002;&#x7576;broadcaster&#x63A5;&#x6536;&#x5230;&#x4EC0;&#x9EBD;&#x6D88;&#x606F;&#x6642;&#xFF0C;&#x5C31;&#x6703;&#x5C07;&#x5176;&#x5EE3;&#x64AD;&#x81F3;&#x6240;&#x6709;&#x9023;&#x63A5;&#x5230;&#x670D;&#x52D9;&#x7AEF;&#x7684;&#x5BA2;&#x6236;&#x7AEF;&#x3002;</p>
<p>&#x73FE;&#x5728;&#x8B93;&#x6211;&#x5011;&#x770B;&#x770B;&#x6BCF;&#x4E00;&#x500B;&#x5BA2;&#x6236;&#x7AEF;&#x7684;goroutine&#x3002;handleConn&#x51FD;&#x6578;&#x6703;&#x7232;&#x5B83;&#x7684;&#x5BA2;&#x6236;&#x7AEF;&#x5275;&#x5EFA;&#x4E00;&#x500B;&#x6D88;&#x606F;&#x767C;&#x51FA;channel&#x4F75;&#x901A;&#x904E;entering channel&#x4F86;&#x901A;&#x77E5;&#x5BA2;&#x6236;&#x7AEF;&#x7684;&#x5230;&#x4F86;&#x3002;&#x7136;&#x5F8C;&#x5B83;&#x6703;&#x8B80;&#x53D6;&#x5BA2;&#x6236;&#x7AEF;&#x767C;&#x4F86;&#x7684;&#x6BCF;&#x4E00;&#x884C;&#x6587;&#x672C;&#xFF0C;&#x4F75;&#x901A;&#x904E;&#x5168;&#x5C40;&#x7684;&#x6D88;&#x606F;channel&#x4F86;&#x5C07;&#x9019;&#x4E9B;&#x6587;&#x672C;&#x767C;&#x9001;&#x51FA;&#x53BB;&#xFF0C;&#x4F75;&#x7232;&#x6BCF;&#x689D;&#x6D88;&#x606F;&#x5E36;&#x4E0A;&#x767C;&#x9001;&#x8005;&#x7684;&#x524D;&#x7DB4;&#x4F86;&#x6A19;&#x660E;&#x6D88;&#x606F;&#x8EAB;&#x4EFD;&#x3002;&#x7576;&#x5BA2;&#x6236;&#x7AEF;&#x767C;&#x9001;&#x5B8C;&#x7562;&#x5F8C;&#xFF0C;handleConn&#x6703;&#x901A;&#x904E;leaving&#x9019;&#x500B;channel&#x4F86;&#x901A;&#x77E5;&#x5BA2;&#x6236;&#x7AEF;&#x7684;&#x96E2;&#x958B;&#x4F75;&#x95DC;&#x9589;&#x9023;&#x63A5;&#x3002;</p>
<pre><code class="lang-go"><span class="hljs-keyword">func</span> handleConn(conn net.Conn) {
ch := <span class="hljs-built_in">make</span>(<span class="hljs-keyword">chan</span> <span class="hljs-typename">string</span>) <span class="hljs-comment">// outgoing client messages</span>
<span class="hljs-keyword">go</span> clientWriter(conn, ch)
@@ -2096,7 +2100,7 @@
}
}
</code></pre>
<p>&#x53E6;&#x5916;&#xFF0C;handleConn&#x7232;&#x6BCF;&#x4E00;&#x500B;&#x5BA2;&#x6236;&#x7AEF;&#x5275;&#x5EFA;&#x4E86;&#x4E00;&#x500B;clientWriter&#x7684;goroutine&#x4F86;&#x63A5;&#x6536;&#x5411;&#x5BA2;&#x6236;&#x7AEF;&#x767C;&#x9F63;&#x6D88;&#x606F;channel&#x4E2D;&#x767C;&#x9001;&#x7684;&#x5EE3;&#x64AD;&#x6D88;&#x606F;&#xFF0C;&#x4F75;&#x5C07;&#x5B83;&#x5011;&#x5BEB;&#x5165;&#x5230;&#x5BA2;&#x6236;&#x7AEF;&#x7684;&#x7DB2;&#x7D61;&#x9023;&#x63A5;&#x3002;&#x5BA2;&#x6236;&#x7AEF;&#x7684;&#x8B80;&#x53D6;&#x65B9;&#x5FAA;&#x74B0;&#x6703;&#x5728;broadcaster&#x63A5;&#x6536;&#x5230;leaving&#x901A;&#x77E5;&#x4F75;&#x95DC;&#x9589;&#x4E86;channel&#x5F8C;&#x7D42;&#x6B62;&#x3002;</p>
<p>&#x53E6;&#x5916;&#xFF0C;handleConn&#x7232;&#x6BCF;&#x4E00;&#x500B;&#x5BA2;&#x6236;&#x7AEF;&#x5275;&#x5EFA;&#x4E86;&#x4E00;&#x500B;clientWriter&#x7684;goroutine&#x4F86;&#x63A5;&#x6536;&#x5411;&#x5BA2;&#x6236;&#x7AEF;&#x767C;&#x51FA;&#x6D88;&#x606F;channel&#x4E2D;&#x767C;&#x9001;&#x7684;&#x5EE3;&#x64AD;&#x6D88;&#x606F;&#xFF0C;&#x4F75;&#x5C07;&#x5B83;&#x5011;&#x5BEB;&#x5165;&#x5230;&#x5BA2;&#x6236;&#x7AEF;&#x7684;&#x7DB2;&#x7D61;&#x9023;&#x63A5;&#x3002;&#x5BA2;&#x6236;&#x7AEF;&#x7684;&#x8B80;&#x53D6;&#x65B9;&#x5FAA;&#x74B0;&#x6703;&#x5728;broadcaster&#x63A5;&#x6536;&#x5230;leaving&#x901A;&#x77E5;&#x4F75;&#x95DC;&#x9589;&#x4E86;channel&#x5F8C;&#x7D42;&#x6B62;&#x3002;</p>
<p>&#x4E0B;&#x9762;&#x6F14;&#x793A;&#x7684;&#x662F;&#x7576;&#x670D;&#x52D9;&#x5668;&#x6709;&#x5169;&#x500B;&#x6D3B;&#x52D5;&#x7684;&#x5BA2;&#x6236;&#x7AEF;&#x9023;&#x63A5;&#xFF0C;&#x4F75;&#x4E14;&#x5728;&#x5169;&#x500B;&#x7A97;&#x53E3;&#x4E2D;&#x904B;&#x884C;&#x7684;&#x60C5;&#x6CC1;&#xFF0C;&#x4F7F;&#x7528;netcat&#x4F86;&#x804A;&#x5929;&#xFF1A;</p>
<pre><code>$ go build gopl.io/ch8/chat
$ go build gopl.io/ch8/netcat3
@@ -2121,7 +2125,7 @@ You are 127.0.0.1:64216 127.0.0.1:64216 has arrived
<p>&#x7DF4;&#x7FD2;8.12: &#x4F7F;broadcaster&#x80FD;&#x5920;&#x5C07;arrival&#x4E8B;&#x4EF6;&#x901A;&#x77E5;&#x7576;&#x524D;&#x6240;&#x6709;&#x7684;&#x5BA2;&#x6236;&#x7AEF;&#x3002;&#x7232;&#x4E86;&#x9054;&#x6210;&#x9019;&#x500B;&#x76EE;&#x7684;&#xFF0C;&#x4F60;&#x9700;&#x8981;&#x6709;&#x4E00;&#x500B;&#x5BA2;&#x6236;&#x7AEF;&#x7684;&#x96C6;&#x5408;&#xFF0C;&#x4F75;&#x4E14;&#x5728;entering&#x548C;leaving&#x7684;channel&#x4E2D;&#x8A18;&#x9332;&#x5BA2;&#x6236;&#x7AEF;&#x7684;&#x540D;&#x5B57;&#x3002;
&#x7DF4;&#x7FD2;8.13: &#x4F7F;&#x804A;&#x5929;&#x670D;&#x52D9;&#x5668;&#x80FD;&#x5920;&#x65B7;&#x958B;&#x7A7A;&#x9592;&#x7684;&#x5BA2;&#x6236;&#x7AEF;&#x9023;&#x63A5;&#xFF0C;&#x6BD4;&#x5982;&#x6700;&#x8FD1;&#x4E94;&#x5206;&#x9418;&#x4E4B;&#x5F8C;&#x6C92;&#x6709;&#x767C;&#x9001;&#x4EFB;&#x4F55;&#x6D88;&#x606F;&#x7684;&#x90A3;&#x4E9B;&#x5BA2;&#x6236;&#x7AEF;&#x3002;&#x63D0;&#x793A;&#xFF1A;&#x53EF;&#x4EE5;&#x5728;&#x5176;&#x5B83;goroutine&#x4E2D;&#x8ABF;&#x7528;conn.Close()&#x4F86;&#x89E3;&#x9664;Read&#x8ABF;&#x7528;&#xFF0C;&#x5C31;&#x50CF;input.Scanner()&#x6240;&#x505A;&#x7684;&#x90A3;&#x6A23;&#x3002;
&#x7DF4;&#x7FD2;8.14: &#x8129;&#x6539;&#x804A;&#x5929;&#x670D;&#x52D9;&#x5668;&#x7684;&#x7DB2;&#x7D61;&#x5354;&#x8B70;&#x9019;&#x6A23;&#x6BCF;&#x4E00;&#x500B;&#x5BA2;&#x6236;&#x7AEF;&#x5C31;&#x53EF;&#x4EE5;&#x5728;entering&#x6642;&#x53EF;&#x4EE5;&#x63D0;&#x4F9B;&#x5B83;&#x5011;&#x7684;&#x540D;&#x5B57;&#x3002;&#x5C07;&#x6D88;&#x606F;&#x524D;&#x7DB4;&#x7531;&#x4E4B;&#x524D;&#x7684;&#x7DB2;&#x7D61;&#x5730;&#x5740;&#x6539;&#x7232;&#x9019;&#x500B;&#x540D;&#x5B57;&#x3002;
&#x7DF4;&#x7FD2;8.15: &#x5982;&#x679C;&#x4E00;&#x500B;&#x5BA2;&#x6236;&#x7AEF;&#x6C92;&#x6709;&#x53CA;&#x6642;&#x5730;&#x8B80;&#x53D6;&#x6578;&#x64DA;&#x53EF;&#x80FD;&#x6703;&#x5C0E;&#x81F4;&#x6240;&#x6709;&#x7684;&#x5BA2;&#x6236;&#x7AEF;&#x88AB;&#x963B;&#x585E;&#x3002;&#x8129;&#x6539;broadcaster&#x4F86;&#x8DF3;&#x904E;&#x4E00;&#x689D;&#x6D88;&#x606F;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x7B49;&#x5F85;&#x9019;&#x500B;&#x5BA2;&#x6236;&#x7AEF;&#x4E00;&#x76F4;&#x5230;&#x5176;&#x6E96;&#x5099;&#x597D;&#x5BEB;&#x3002;&#x6216;&#x8005;&#x7232;&#x6BCF;&#x4E00;&#x500B;&#x5BA2;&#x6236;&#x7AEF;&#x7684;&#x6D88;&#x606F;&#x767C;&#x9F63;channel&#x5EFA;&#x7ACB;&#x7DE9;&#x885D;&#x5340;&#xFF0C;&#x9019;&#x6A23;&#x5927;&#x90E8;&#x5206;&#x7684;&#x6D88;&#x606F;&#x4FBF;&#x4E0D;&#x6703;&#x88AB;&#x4E1F;&#x6389;&#xFF1B;broadcaster&#x61C9;&#x8A72;&#x7528;&#x4E00;&#x500B;&#x975E;&#x963B;&#x585E;&#x7684;send&#x5411;&#x9019;&#x500B;channel&#x4E2D;&#x767C;&#x6D88;&#x606F;&#x3002;</p>
&#x7DF4;&#x7FD2;8.15: &#x5982;&#x679C;&#x4E00;&#x500B;&#x5BA2;&#x6236;&#x7AEF;&#x6C92;&#x6709;&#x53CA;&#x6642;&#x5730;&#x8B80;&#x53D6;&#x6578;&#x64DA;&#x53EF;&#x80FD;&#x6703;&#x5C0E;&#x81F4;&#x6240;&#x6709;&#x7684;&#x5BA2;&#x6236;&#x7AEF;&#x88AB;&#x963B;&#x585E;&#x3002;&#x8129;&#x6539;broadcaster&#x4F86;&#x8DF3;&#x904E;&#x4E00;&#x689D;&#x6D88;&#x606F;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x7B49;&#x5F85;&#x9019;&#x500B;&#x5BA2;&#x6236;&#x7AEF;&#x4E00;&#x76F4;&#x5230;&#x5176;&#x6E96;&#x5099;&#x597D;&#x5BEB;&#x3002;&#x6216;&#x8005;&#x7232;&#x6BCF;&#x4E00;&#x500B;&#x5BA2;&#x6236;&#x7AEF;&#x7684;&#x6D88;&#x606F;&#x767C;&#x51FA;channel&#x5EFA;&#x7ACB;&#x7DE9;&#x885D;&#x5340;&#xFF0C;&#x9019;&#x6A23;&#x5927;&#x90E8;&#x5206;&#x7684;&#x6D88;&#x606F;&#x4FBF;&#x4E0D;&#x6703;&#x88AB;&#x4E1F;&#x6389;&#xFF1B;broadcaster&#x61C9;&#x8A72;&#x7528;&#x4E00;&#x500B;&#x975E;&#x963B;&#x585E;&#x7684;send&#x5411;&#x9019;&#x500B;channel&#x4E2D;&#x767C;&#x6D88;&#x606F;&#x3002;</p>
</section>
@@ -2132,7 +2136,7 @@ You are 127.0.0.1:64216 127.0.0.1:64216 has arrived
</div>
<a href="../ch8/ch8-09.html" class="navigation navigation-prev " aria-label="Previous page: 併發的退"><i class="fa fa-angle-left"></i></a>
<a href="../ch8/ch8-09.html" class="navigation navigation-prev " aria-label="Previous page: 併發的退"><i class="fa fa-angle-left"></i></a>
<a href="../ch9/ch9.html" class="navigation navigation-next " aria-label="Next page: 基於共享變量的併發"><i class="fa fa-angle-right"></i></a>
@@ -2153,7 +2157,7 @@ You are 127.0.0.1:64216 127.0.0.1:64216 has arrived
<script>
require(["gitbook"], function(gitbook) {
var config = {"highlight":{},"sharing":{"facebook":true,"twitter":true,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"fontsettings":{"theme":"white","family":"sans","size":2}};
var config = {"katex":{},"highlight":{},"sharing":{"facebook":true,"twitter":true,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"fontsettings":{"theme":"white","family":"sans","size":2}};
gitbook.start(config);
});
</script>