{"id":728,"date":"2020-11-17T21:36:04","date_gmt":"2020-11-17T13:36:04","guid":{"rendered":"https:\/\/www.rayer.idv.tw\/blog\/?p=728"},"modified":"2020-11-19T16:24:19","modified_gmt":"2020-11-19T08:24:19","slug":"go-%e5%a6%82%e4%bd%95%e9%99%8d%e4%bd%8e%e9%9d%9e%e5%90%8c%e6%ad%a5%e8%99%95%e7%90%86%e7%9a%84%e5%bb%b6%e9%81%b2","status":"publish","type":"post","link":"https:\/\/www.rayer.idv.tw\/blog\/?p=728","title":{"rendered":"go \u5982\u4f55\u964d\u4f4e\u975e\u540c\u6b65\u8655\u7406\u7684\u5ef6\u9072"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">\u539f\u59cbslide\u5728<a href=\"https:\/\/talks.golang.org\/2012\/concurrency.slide#42\" target=\"_blank\" rel=\"noreferrer noopener\">\u9019\u88e1<\/a>\u3002\u539f\u6587\u7684\u7bc4\u4f8b\u7f3a\u4e86\u4e00\u4e9b\u6771\u897f\u4ee5\u81f4\u65bccompile\u8d77\u4f86\u6703\u932f\u8aa4\uff0c\u6211\u628a\u7f3a\u7684\u6771\u897f\u9806\u624b\u88dc\u4e0a\u53bb\uff0c\u4ee5\u53ca\u88dc\u4e0a\u4e00\u4e9b\u6211\u9019\u908a\u7684\u5fc3\u5f97\u8ddf\u984d\u5916\u7684\u6e2c\u8a66\u65b9\u6cd5\u3002<\/p>\n\n\n\n<!--more-->\n\n\n\n<div class=\"wp-block-jetpack-markdown\"><h2>\u7bc4\u4f8b : Google Search<\/h2>\n<ul>\n<li>Google Search\u662f\u5e79\u561b\u7684\n<ul>\n<li>\u7d66\u4e00\u500bquery string\uff0c\u56de\u50b3\u641c\u5c0b\u7d50\u679c\uff08\u4e5f\u8a31\u9084\u52a0\u4e9b\u5ee3\u544a\uff09<\/li>\n<\/ul>\n<\/li>\n<li>\u6211\u5011\u8981\u600e\u9ebc\u5f97\u5230\u641c\u5c0b\u7d50\u679c\n<ul>\n<li>\u5206\u5225\u9001query string\u5230Web\/Image\/Youtube\/Map\/News&#8230;\u7b49\u641c\u5c0b\u5f15\u64ce\uff0c\u7136\u5f8c\u628a\u7d50\u679c\u5408\u4f75\u8d77\u4f86<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u6211\u5011\u8981\u600e\u9ebcimplement\u9019\u500b\u7cfb\u7d71?<\/p>\n<h2>\u5148\u4f86Mockup\u9019\u500b\u7cfb\u7d71\u7684\u6a23\u5b50\u5427<\/h2>\n<p>\u6211\u5011\u7528<code>fakeSearch<\/code>\u4f86\u6a21\u64ec\u4e00\u500bServer\uff0c\u9019\u500bserver\u53ef\u80fd\u6703\u5f88\u5feb\u5373\u6642\u7684\u53cd\u61c9\uff0c\u4e5f\u53ef\u80fd\u6700\u591a\u6703\u5728100ms\u4ee5\u5f8c\u624d\u53cd\u61c9\u3002<\/p>\n<pre><code class=\"language-go\">var (\n    Web = fakeSearch(&quot;web&quot;)\n    Image = fakeSearch(&quot;image&quot;)\n    Video = fakeSearch(&quot;video&quot;)\n)\n\ntype Search func(query string) Result\ntype Result string\n\n\/\/\u7b2c\u4e00\u500b\u7248\u672c\u7684google search, \u6700\u76f4\u89c0\nfunc Google(query string) (results []Result) {\n\tresults = append(results, Web(query))\n\tresults = append(results, Image(query))\n\tresults = append(results, Video(query))\n\treturn\n}\n\nfunc fakeSearch(kind string) Search {\n        return func(query string) Result {\n        \/\/\u6a21\u64ecServer\u5ef6\u9072\n              time.Sleep(time.Duration(rand.Intn(100)) * time.Millisecond)\n              return Result(fmt.Sprintf(&quot;%s result for %q\\n&quot;, kind, query))\n        }\n}\n<\/code><\/pre>\n<p>\u6e2c\u8a66\u4e00\u4e0b\u9019\u500bmock\u80fd\u4e0d\u80fdwork<\/p>\n<pre><code class=\"language-go\">func main() {\n    rand.Seed(time.Now().UnixNano())\n    start := time.Now()\n    results := Google(&quot;golang&quot;)\n    elapsed := time.Since(start)\n    fmt.Println(results)\n    fmt.Println(elapsed)\n}\n<\/code><\/pre>\n<h2>Google Search 1.0<\/h2>\n<p>1.0\u5c31\u662f\u6211\u5011\u653e\u5728mockup\u88e1\u9762\u7684\u90a3\u500b\u7248\u672c\uff0cgoogle\u6703\u53bb\u5404\u7a2e\u4f86\u6e90\u641c\u5c0b\u7d50\u679c\uff0c\u7136\u5f8c\u628a\u5b83\u7d66\u5408\u4f75\u8d77\u4f86\u50b3\u56de\u53bb\u3002<\/p>\n<pre><code class=\"language-go\">func Google(query string) (results []Result) {\n\tresults = append(results, Web(query))\n\tresults = append(results, Image(query))\n\tresults = append(results, Video(query))\n\treturn\n}\n<\/code><\/pre>\n<h2>Google Search 2.0<\/h2>\n<p>1.0\u986f\u7136\u6709\u4e9b\u554f\u984c\uff0c\u4ed6\u7684query\u90fd\u662f\u8981\u7b49\u4e0a\u4e00\u500bquery\u5b8c\u6210\u4ee5\u5f8c\u624d\u80fd\u555f\u52d5\uff0c\u6240\u4ee5\u6574\u500b\u7a0b\u5e8f\u6703\u88ab\u963b\u585e\u597d\u4e00\u9663\u5b50\u3002\u9019\u500b\u5be6\u4f5c\u4e0d\u9700\u8981\u9396\uff0c\u6c92\u6709conditional variable\uff0c\u4e5f\u4e0d\u9700\u8981callbacks<\/p>\n<pre><code class=\"language-go\">func Google(query string) (results []Result) {\n    c := make(chan Result)\n    go func() { c &lt;- Web(query) } ()\n    go func() { c &lt;- Image(query) } ()\n    go func() { c &lt;- Video(query) } ()\n\n    for i := 0; i &lt; 3; i++ {\n        result := &lt;-c\n        results = append(results, result)\n    }\n    return\n}\n<\/code><\/pre>\n<h2>Google Search 2.1<\/h2>\n<p>\u90a3\u8981\u662f\u6211\u5011\u8a2d\u5b9a\u4e00\u500btimeout\u5462?<\/p>\n<pre><code class=\"language-go\">    c := make(chan Result)\n    go func() { c &lt;- Web(query) } ()\n    go func() { c &lt;- Image(query) } ()\n    go func() { c &lt;- Video(query) } ()\n\n    timeout := time.After(80 * time.Millisecond)\n    for i := 0; i &lt; 3; i++ {\n        select {\n        case result := &lt;-c:\n            results = append(results, result)\n        case &lt;-timeout:\n            fmt.Println(&quot;timed out&quot;)\n            return\n        }\n    }\n    return\n\n<\/code><\/pre>\n<p>\u4f46\u662f\u986f\u7136\u7684\uff0cdrop\u6389\u592a\u6162\u7684search\u5176\u5be6\u4e0d\u592a\u597d\u3002\u5047\u8a2dServer\u56de\u61c9\u6642\u9593\u5c31\u662f0-100\u4e4b\u9593\uff0c\u800c\u592a\u6162\u7684response\u5c31\u662f\u6703\u88abdrop\u6389\uff0c\u90a3\u6709\u6c92\u6709\u4ec0\u9ebc\u65b9\u6cd5\u80fd\u62ff\u5230\u5b8c\u6574\u7684result\u5462\uff1f<\/p>\n<h2>Google Search 3.0<\/h2>\n<h3>\u89e3\u6c7adrop\u904e\u6162result\u7684\u554f\u984c<\/h3>\n<p>\u8981\u89e3\u6c7a2.1\u7684\u554f\u984c\u5176\u5be6\u4e5f\u4e0d\u96e3\uff0c\u6211\u5011\u5c0d\u540c\u4e00\u500b\u670d\u52d9\uff08\u6bd4\u65b9\u8aaa<code>Video<\/code>\uff09\u505a\u51fa\u591a\u500brequest\uff0c\u53d6\u5176\u4e2d\u6700\u5feb\u7684\u4e00\u500b\u5c31\u53ef\u4ee5\u4e86 &#8212; \u9019\u4e5f\u662fgoogle\u76ee\u524d\u7684\u505a\u6cd5\uff0c\u6240\u4ee5\u5927\u5bb6\u77e5\u9053\u70ba\u4ec0\u9ebc\u641c\u5c0b\u90a3\u9ebc\u8017\u96fb\u4e86\u5427&#8230;.<\/p>\n<pre><code class=\"language-go\">func First(query string, replicas ...Search) Result {\n    c := make(chan Result)\n    searchReplica := func(i int) { c &lt;- replicas[i](query) }\n    for i := range replicas {\n        go searchReplica(i)\n    }\n    return &lt;-c\n}\n\nfunc main() {\n    rand.Seed(time.Now().UnixNano())\n    start := time.Now()\n    result := First(&quot;golang&quot;,\n        fakeSearch(&quot;replica 1&quot;),\n        fakeSearch(&quot;replica 2&quot;))\n    elapsed := time.Since(start)\n    fmt.Println(result)\n    fmt.Println(elapsed)\n}\n<\/code><\/pre>\n<h3>\u6240\u4ee53.0\u5be6\u4f5c\u5927\u6982\u6703\u9577\u9019\u6a23<\/h3>\n<p>\u8a18\u5f97\u8981\u5148\u5728\u4e0a\u65b9\u984d\u5916\u5ba3\u544aWeb2\/Image2\/Video2<\/p>\n<pre><code class=\"language-go\">var (\n\tWeb = fakeSearch(&quot;web&quot;)\n\tImage = fakeSearch(&quot;image&quot;)\n\tVideo = fakeSearch(&quot;video&quot;)\n\tWeb2 = fakeSearch(&quot;web&quot;)\n\tImage2 = fakeSearch(&quot;image&quot;)\n\tVideo2 = fakeSearch(&quot;video&quot;)\n)\n<\/code><\/pre>\n<p>\u7136\u5f8c3.0\u6703\u662f\u9577\u9019\u6a23<\/p>\n<pre><code class=\"language-go\">    c := make(chan Result)\n    go func() { c &lt;- First(query, Web, Web2) } ()\n    go func() { c &lt;- First(query, Image, Image2) } ()\n    go func() { c &lt;- First(query, Video, Video2) } ()\n    timeout := time.After(80 * time.Millisecond)\n    for i := 0; i &lt; 3; i++ {\n        select {\n        case result := &lt;-c:\n            results = append(results, result)\n        case &lt;-timeout:\n            fmt.Println(&quot;timed out&quot;)\n            return\n        }\n    }\n    return\n<\/code><\/pre>\n<h3>3.0\u9084\u6709\u4ec0\u9ebc\u554f\u984c\u5462?<\/h3>\n<p>\u9019\u500b\u7559\u4f5cBonus\u7d66\u5927\u5bb6\u53c3\u8003\u4e00\u4e0b\u30023.0\u6709\u4e00\u500b\u76f8\u7576\u660e\u986f\u7684bug\u5c31\u662f\uff0c\u7576First\u5f8c\u9762\u7684\u6240\u6709Search\u90fd\u5927\u65bc80\u7684\u6642\u5019\uff0c\u6703\u5c0e\u81f4\u6389\u7d50\u679c\u3002\u6bd4\u65b9\u8aaa\uff0c<code>c &lt;- First(query, Image, Image2)<\/code>\u7576\u5f8c\u9762\u5169\u500b\u56de\u61c9\u901f\u5ea6\u90fd\u6bd480\u6162\uff08\u8a2d\u5b9a\u4e0a\u4ed6\u5011\u901f\u5ea6\u662f0-100\uff09\uff0c\u8a72\u7d50\u679c\u5c31\u4e0d\u898b\u4e86\uff0c\u4f60\u6703\u770b\u5230\u5370\u51fatimed out\u3002<\/p>\n<p>\u6240\u4ee5\u6211\u5011\u9084\u53ef\u4ee5\u7814\u7a76\u770b\u770b :<\/p>\n<ul>\n<li>\u5982\u4f55\u907f\u514d\u6389\u8cc7\u6599\uff1f<\/li>\n<li>\u5982\u4f55\u5728\u6389\u8cc7\u6599\u7684\u6642\u5019\u52d5\u614b\u628a\u5bb9\u5fcd\u503c\u62c9\u9ad8\uff1f\u597d\u8655\u8ddf\u58de\u8655\u5206\u5225\u662f\uff1f<\/li>\n<li>\u6216\u8005\u63db\u500b\u65b9\u6cd5\uff0c\u5982\u4f55\u52d5\u614b\u589e\u52a0replica\uff1f\u597d\u8655\u8ddf\u58de\u8655\u5206\u5225\u662f\uff1f\u5728\u73fe\u5be6\u751f\u6d3b\u4e2d\uff0c\u52d5\u614b\u589e\u52a0replica\u7684\u8a71\uff0c\u61c9\u8a72\u8981\u6ce8\u610f\u4ec0\u9ebc\u689d\u4ef6\uff1f<\/li>\n<li>\u4e8b\u5be6\u4e0a\u7db2\u8def\u9023\u7dda\u901f\u5ea6\u4e26\u975efakeSearch\u9019\u6a23\u7684\u7a69\u5b9a\u5728\u5169\u500b\u6578\u503c\u4e2d\u9593\u5f98\u5f8a\uff0c\u6709\u6c92\u6709\u66f4\u597d\u7684\u6a21\u578b\u53ef\u4ee5\u6a21\u64ec\u4e00\u6bb5\u597d\u4e00\u6bb5\u58de\u7684\u4e0d\u7a69\u5b9a\u7db2\u8def\uff1f\u751a\u81f3package drop?<\/li>\n<\/ul>\n<p>\u5982\u679c\u8981\u6e2c\u8a66\u9019\u500b\u6975\u7aef\u72c0\u614b\u7684\u8a71\uff0c\u6211\u5011\u53ef\u4ee5\u628a<code>timeout := time.After(80 *time.Millisecond)<\/code>\u768480\u6539\u6210\u4e00\u500b\u66f4\u5c0f\u7684\u6578\u5b57\uff0c\u6bd4\u65b9\u8aaa40\u3002\u6216\u8005\u8aaa\uff0c\u6211\u5011\u53ef\u4ee5\u628afakeSearch\u7684response time\u52d5\u614b\u62c9\u5230\u4e00\u500b\u66f4\u5927\u7684\u7bc4\u570d\uff0c\u5c31\u53ef\u4ee5\u5f88\u5bb9\u6613\u91cd\u73fe\u51fa\u9019\u500b\u6389\u8cc7\u6599\u7684\u72c0\u614b\u3002<\/p>\n<h2>\u4f86\u6bd4\u8f03\u4e00\u4e0b1.0 2.0 3.0\u7684\u6548\u80fd<\/h2>\n<p>demo code\u5982\u4e0b\uff0c\u7d50\u679c\u5927\u7d04\u6703\u50cf\u662f\u9019\u6a23<\/p>\n<p>Function : main.Google1 Total time : 1639       Avg time : 163\nFunction : main.Google2 Total time : 712        Avg time : 71\nFunction : main.Google3 Total time : 550        Avg time : 55<\/p>\n<pre><code class=\"language-go\">package main\n\nimport (\n\t&quot;fmt&quot;\n\t&quot;math\/rand&quot;\n\t&quot;reflect&quot;\n\t&quot;runtime&quot;\n\t&quot;time&quot;\n)\n\nvar (\n\tWeb = fakeSearch(&quot;web&quot;)\n\tImage = fakeSearch(&quot;image&quot;)\n\tVideo = fakeSearch(&quot;video&quot;)\n\tWeb2 = fakeSearch(&quot;web&quot;)\n\tImage2 = fakeSearch(&quot;image&quot;)\n\tVideo2 = fakeSearch(&quot;video&quot;)\n)\n\ntype Search func(query string) Result\ntype Google func(query string) []Result\ntype Result string\n\nfunc fakeSearch(kind string) Search {\n\treturn func(query string) Result {\n\t\ttime.Sleep(time.Duration(rand.Intn(100)) * time.Millisecond)\n\t\treturn Result(fmt.Sprintf(&quot;%s result for %q\\n&quot;, kind, query))\n\t}\n}\n\nfunc Google1(query string) (results []Result) {\n\tresults = append(results, Web(query))\n\tresults = append(results, Image(query))\n\tresults = append(results, Video(query))\n\treturn\n}\n\nfunc Google2(query string) (results []Result) {\n\tc := make(chan Result)\n\tgo func() { c &lt;- Web(query) } ()\n\tgo func() { c &lt;- Image(query) } ()\n\tgo func() { c &lt;- Video(query) } ()\n\n\tfor i := 0; i &lt; 3; i++ {\n\t\tresult := &lt;-c\n\t\tresults = append(results, result)\n\t}\n\treturn\n}\n\nfunc Google21(query string) (results []Result) {\n\tc := make(chan Result)\n\tgo func() { c &lt;- Web(query) } ()\n\tgo func() { c &lt;- Image(query) } ()\n\tgo func() { c &lt;- Video(query) } ()\n\n\ttimeout := time.After(80 * time.Millisecond)\n\tfor i := 0; i &lt; 3; i++ {\n\t\tselect {\n\t\tcase result := &lt;-c:\n\t\t\tresults = append(results, result)\n\t\tcase &lt;-timeout:\n\t\t\tfmt.Println(&quot;timed out&quot;)\n\t\t\treturn\n\t\t}\n\t}\n\treturn\n}\n\nfunc First(query string, replicas ...Search) Result {\n\tc := make(chan Result)\n\tsearchReplica := func(i int) { c &lt;- replicas[i](query) }\n\tfor i := range replicas {\n\t\tgo searchReplica(i)\n\t}\n\treturn &lt;-c\n}\n\nfunc Google3(query string) (results []Result) {\n\tc := make(chan Result)\n\tgo func() { c &lt;- First(query, Web, Web2) } ()\n\tgo func() { c &lt;- First(query, Image, Image2) } ()\n\tgo func() { c &lt;- First(query, Video, Video2) } ()\n\ttimeout := time.After(80 * time.Millisecond)\n\tfor i := 0; i &lt; 3; i++ {\n\t\tselect {\n\t\tcase result := &lt;-c:\n\t\t\tresults = append(results, result)\n\t\tcase &lt;-timeout:\n\t\t\tfmt.Println(&quot;timed out&quot;)\n\t\t\treturn\n\t\t}\n\t}\n\treturn\n}\n\nfunc Benchmark(google Google) (output []Result, start time.Time, elapsed time.Duration) {\n\tstart = time.Now()\n\toutput = google(&quot;golang&quot;)\n\telapsed = time.Since(start)\n\treturn\n}\n\nfunc GetFunctionName(i interface{}) string {\n\treturn runtime.FuncForPC(reflect.ValueOf(i).Pointer()).Name()\n}\n\nfunc main() {\n\ttest := []Google{Google1, Google2, Google3}\n\tconst loops = 10\n\tfor _, google := range test {\n\t\tvar totalTime int64\n\t\tfor round := 0; round &lt; loops; round++ {\n\t\t\trand.Seed(time.Now().UnixNano())\n\t\t\t\/\/fmt.Printf(&quot;start\\t : %d -&gt; %s\\n&quot;, round, GetFunctionName(google))\n\t\t\t_, _, elapsed := Benchmark(google)\n\t\t\ttotalTime += elapsed.Milliseconds()\n\t\t\t\/\/fmt.Printf(&quot;end\\t : %d -&gt; %s(%s)\\n&quot;, round, GetFunctionName(google), elapsed)\n\t\t}\n\t\tfmt.Printf(&quot;Function : %s\\tTotal time : %d\\tAvg time : %d\\n&quot;, GetFunctionName(google), totalTime, totalTime \/ 10)\n\t}\n}\n<\/code><\/pre>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u539f\u59cbslide\u5728\u9019\u88e1\u3002\u539f\u6587\u7684\u7bc4\u4f8b\u7f3a\u4e86\u4e00\u4e9b\u6771\u897f\u4ee5\u81f4\u65bccompile\u8d77\u4f86\u6703\u932f\u8aa4\uff0c\u6211\u628a\u7f3a\u7684\u6771\u897f\u9806\u624b\u88dc\u4e0a\u53bb\uff0c\u4ee5\u53ca\u88dc\u4e0a\u4e00\u4e9b\u6211\u9019\u908a\u7684\u5fc3\u5f97\u8ddf\u984d\u5916\u7684\u6e2c\u8a66\u65b9\u6cd5\u3002<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[38,84],"tags":[86],"class_list":["post-728","post","type-post","status-publish","format-standard","hentry","category-code","category-84","tag-golang"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>go \u5982\u4f55\u964d\u4f4e\u975e\u540c\u6b65\u8655\u7406\u7684\u5ef6\u9072 - Fox Nest<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.rayer.idv.tw\/blog\/?p=728\" \/>\n<meta property=\"og:locale\" content=\"zh_TW\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"go \u5982\u4f55\u964d\u4f4e\u975e\u540c\u6b65\u8655\u7406\u7684\u5ef6\u9072 - Fox Nest\" \/>\n<meta property=\"og:description\" content=\"\u539f\u59cbslide\u5728\u9019\u88e1\u3002\u539f\u6587\u7684\u7bc4\u4f8b\u7f3a\u4e86\u4e00\u4e9b\u6771\u897f\u4ee5\u81f4\u65bccompile\u8d77\u4f86\u6703\u932f\u8aa4\uff0c\u6211\u628a\u7f3a\u7684\u6771\u897f\u9806\u624b\u88dc\u4e0a\u53bb\uff0c\u4ee5\u53ca\u88dc\u4e0a\u4e00\u4e9b\u6211\u9019\u908a\u7684\u5fc3\u5f97\u8ddf\u984d\u5916\u7684\u6e2c\u8a66\u65b9\u6cd5\u3002\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.rayer.idv.tw\/blog\/?p=728\" \/>\n<meta property=\"og:site_name\" content=\"Fox Nest\" \/>\n<meta property=\"article:published_time\" content=\"2020-11-17T13:36:04+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-11-19T08:24:19+00:00\" \/>\n<meta name=\"author\" content=\"Rayer\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@Rayer\" \/>\n<meta name=\"twitter:site\" content=\"@Rayer\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Rayer\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9810\u4f30\u95b1\u8b80\u6642\u9593\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 \u5206\u9418\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.rayer.idv.tw\\\/blog\\\/?p=728#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.rayer.idv.tw\\\/blog\\\/?p=728\"},\"author\":{\"name\":\"Rayer\",\"@id\":\"https:\\\/\\\/www.rayer.idv.tw\\\/blog\\\/#\\\/schema\\\/person\\\/498379badb270198fef0edd6b06a5bd7\"},\"headline\":\"go \u5982\u4f55\u964d\u4f4e\u975e\u540c\u6b65\u8655\u7406\u7684\u5ef6\u9072\",\"datePublished\":\"2020-11-17T13:36:04+00:00\",\"dateModified\":\"2020-11-19T08:24:19+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.rayer.idv.tw\\\/blog\\\/?p=728\"},\"wordCount\":92,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.rayer.idv.tw\\\/blog\\\/#\\\/schema\\\/person\\\/498379badb270198fef0edd6b06a5bd7\"},\"keywords\":[\"golang\"],\"articleSection\":[\"\u5beb\u5bebCode\",\"\u6280\u8853\"],\"inLanguage\":\"zh-TW\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.rayer.idv.tw\\\/blog\\\/?p=728#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.rayer.idv.tw\\\/blog\\\/?p=728\",\"url\":\"https:\\\/\\\/www.rayer.idv.tw\\\/blog\\\/?p=728\",\"name\":\"go \u5982\u4f55\u964d\u4f4e\u975e\u540c\u6b65\u8655\u7406\u7684\u5ef6\u9072 - Fox Nest\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.rayer.idv.tw\\\/blog\\\/#website\"},\"datePublished\":\"2020-11-17T13:36:04+00:00\",\"dateModified\":\"2020-11-19T08:24:19+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.rayer.idv.tw\\\/blog\\\/?p=728#breadcrumb\"},\"inLanguage\":\"zh-TW\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.rayer.idv.tw\\\/blog\\\/?p=728\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.rayer.idv.tw\\\/blog\\\/?p=728#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9801\",\"item\":\"https:\\\/\\\/www.rayer.idv.tw\\\/blog\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"go \u5982\u4f55\u964d\u4f4e\u975e\u540c\u6b65\u8655\u7406\u7684\u5ef6\u9072\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.rayer.idv.tw\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.rayer.idv.tw\\\/blog\\\/\",\"name\":\"Fox Nest\",\"description\":\"\u6709\u6642\u5019\u7e3d\u60f3\u6709\u500b\u5730\u65b9\u653e\u653e\u96a8\u624b\u4e82\u5beb\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.rayer.idv.tw\\\/blog\\\/#\\\/schema\\\/person\\\/498379badb270198fef0edd6b06a5bd7\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.rayer.idv.tw\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"zh-TW\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.rayer.idv.tw\\\/blog\\\/#\\\/schema\\\/person\\\/498379badb270198fef0edd6b06a5bd7\",\"name\":\"Rayer\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-TW\",\"@id\":\"https:\\\/\\\/i0.wp.com\\\/www.rayer.idv.tw\\\/blog\\\/wp-content\\\/uploads\\\/2022\\\/02\\\/564120_490926324264770_332274456_n.jpg?fit=800%2C600&ssl=1\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/www.rayer.idv.tw\\\/blog\\\/wp-content\\\/uploads\\\/2022\\\/02\\\/564120_490926324264770_332274456_n.jpg?fit=800%2C600&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/www.rayer.idv.tw\\\/blog\\\/wp-content\\\/uploads\\\/2022\\\/02\\\/564120_490926324264770_332274456_n.jpg?fit=800%2C600&ssl=1\",\"width\":800,\"height\":600,\"caption\":\"Rayer\"},\"logo\":{\"@id\":\"https:\\\/\\\/i0.wp.com\\\/www.rayer.idv.tw\\\/blog\\\/wp-content\\\/uploads\\\/2022\\\/02\\\/564120_490926324264770_332274456_n.jpg?fit=800%2C600&ssl=1\"},\"sameAs\":[\"https:\\\/\\\/www.rayer.idv.tw\",\"https:\\\/\\\/x.com\\\/Rayer\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"go \u5982\u4f55\u964d\u4f4e\u975e\u540c\u6b65\u8655\u7406\u7684\u5ef6\u9072 - Fox Nest","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.rayer.idv.tw\/blog\/?p=728","og_locale":"zh_TW","og_type":"article","og_title":"go \u5982\u4f55\u964d\u4f4e\u975e\u540c\u6b65\u8655\u7406\u7684\u5ef6\u9072 - Fox Nest","og_description":"\u539f\u59cbslide\u5728\u9019\u88e1\u3002\u539f\u6587\u7684\u7bc4\u4f8b\u7f3a\u4e86\u4e00\u4e9b\u6771\u897f\u4ee5\u81f4\u65bccompile\u8d77\u4f86\u6703\u932f\u8aa4\uff0c\u6211\u628a\u7f3a\u7684\u6771\u897f\u9806\u624b\u88dc\u4e0a\u53bb\uff0c\u4ee5\u53ca\u88dc\u4e0a\u4e00\u4e9b\u6211\u9019\u908a\u7684\u5fc3\u5f97\u8ddf\u984d\u5916\u7684\u6e2c\u8a66\u65b9\u6cd5\u3002","og_url":"https:\/\/www.rayer.idv.tw\/blog\/?p=728","og_site_name":"Fox Nest","article_published_time":"2020-11-17T13:36:04+00:00","article_modified_time":"2020-11-19T08:24:19+00:00","author":"Rayer","twitter_card":"summary_large_image","twitter_creator":"@Rayer","twitter_site":"@Rayer","twitter_misc":{"\u4f5c\u8005:":"Rayer","\u9810\u4f30\u95b1\u8b80\u6642\u9593":"5 \u5206\u9418"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.rayer.idv.tw\/blog\/?p=728#article","isPartOf":{"@id":"https:\/\/www.rayer.idv.tw\/blog\/?p=728"},"author":{"name":"Rayer","@id":"https:\/\/www.rayer.idv.tw\/blog\/#\/schema\/person\/498379badb270198fef0edd6b06a5bd7"},"headline":"go \u5982\u4f55\u964d\u4f4e\u975e\u540c\u6b65\u8655\u7406\u7684\u5ef6\u9072","datePublished":"2020-11-17T13:36:04+00:00","dateModified":"2020-11-19T08:24:19+00:00","mainEntityOfPage":{"@id":"https:\/\/www.rayer.idv.tw\/blog\/?p=728"},"wordCount":92,"commentCount":0,"publisher":{"@id":"https:\/\/www.rayer.idv.tw\/blog\/#\/schema\/person\/498379badb270198fef0edd6b06a5bd7"},"keywords":["golang"],"articleSection":["\u5beb\u5bebCode","\u6280\u8853"],"inLanguage":"zh-TW","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.rayer.idv.tw\/blog\/?p=728#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.rayer.idv.tw\/blog\/?p=728","url":"https:\/\/www.rayer.idv.tw\/blog\/?p=728","name":"go \u5982\u4f55\u964d\u4f4e\u975e\u540c\u6b65\u8655\u7406\u7684\u5ef6\u9072 - Fox Nest","isPartOf":{"@id":"https:\/\/www.rayer.idv.tw\/blog\/#website"},"datePublished":"2020-11-17T13:36:04+00:00","dateModified":"2020-11-19T08:24:19+00:00","breadcrumb":{"@id":"https:\/\/www.rayer.idv.tw\/blog\/?p=728#breadcrumb"},"inLanguage":"zh-TW","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.rayer.idv.tw\/blog\/?p=728"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.rayer.idv.tw\/blog\/?p=728#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9801","item":"https:\/\/www.rayer.idv.tw\/blog"},{"@type":"ListItem","position":2,"name":"go \u5982\u4f55\u964d\u4f4e\u975e\u540c\u6b65\u8655\u7406\u7684\u5ef6\u9072"}]},{"@type":"WebSite","@id":"https:\/\/www.rayer.idv.tw\/blog\/#website","url":"https:\/\/www.rayer.idv.tw\/blog\/","name":"Fox Nest","description":"\u6709\u6642\u5019\u7e3d\u60f3\u6709\u500b\u5730\u65b9\u653e\u653e\u96a8\u624b\u4e82\u5beb","publisher":{"@id":"https:\/\/www.rayer.idv.tw\/blog\/#\/schema\/person\/498379badb270198fef0edd6b06a5bd7"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.rayer.idv.tw\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"zh-TW"},{"@type":["Person","Organization"],"@id":"https:\/\/www.rayer.idv.tw\/blog\/#\/schema\/person\/498379badb270198fef0edd6b06a5bd7","name":"Rayer","image":{"@type":"ImageObject","inLanguage":"zh-TW","@id":"https:\/\/i0.wp.com\/www.rayer.idv.tw\/blog\/wp-content\/uploads\/2022\/02\/564120_490926324264770_332274456_n.jpg?fit=800%2C600&ssl=1","url":"https:\/\/i0.wp.com\/www.rayer.idv.tw\/blog\/wp-content\/uploads\/2022\/02\/564120_490926324264770_332274456_n.jpg?fit=800%2C600&ssl=1","contentUrl":"https:\/\/i0.wp.com\/www.rayer.idv.tw\/blog\/wp-content\/uploads\/2022\/02\/564120_490926324264770_332274456_n.jpg?fit=800%2C600&ssl=1","width":800,"height":600,"caption":"Rayer"},"logo":{"@id":"https:\/\/i0.wp.com\/www.rayer.idv.tw\/blog\/wp-content\/uploads\/2022\/02\/564120_490926324264770_332274456_n.jpg?fit=800%2C600&ssl=1"},"sameAs":["https:\/\/www.rayer.idv.tw","https:\/\/x.com\/Rayer"]}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/pacpZ9-bK","amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.rayer.idv.tw\/blog\/index.php?rest_route=\/wp\/v2\/posts\/728","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.rayer.idv.tw\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.rayer.idv.tw\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.rayer.idv.tw\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.rayer.idv.tw\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=728"}],"version-history":[{"count":2,"href":"https:\/\/www.rayer.idv.tw\/blog\/index.php?rest_route=\/wp\/v2\/posts\/728\/revisions"}],"predecessor-version":[{"id":730,"href":"https:\/\/www.rayer.idv.tw\/blog\/index.php?rest_route=\/wp\/v2\/posts\/728\/revisions\/730"}],"wp:attachment":[{"href":"https:\/\/www.rayer.idv.tw\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=728"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rayer.idv.tw\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=728"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rayer.idv.tw\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=728"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}