{"@attributes":{"version":"2.0"},"channel":{"title":"14March","link":"https:\/\/hcraM41.github.io\/","description":"Recent content on 14March","generator":"Hugo -- gohugo.io","language":"zh-cn","copyright":"Ycz","lastBuildDate":"Sat, 10 May 2025 23:03:15 +0800","item":[{"title":"defer","link":"https:\/\/hcraM41.github.io\/p\/defer\/","pubDate":"Sat, 10 May 2025 23:03:15 +0800","guid":"https:\/\/hcraM41.github.io\/p\/defer\/","description":"<img src=\"https:\/\/hcraM41.github.io\/p\/defer\/2.png\" alt=\"Featured image of post defer\" \/><h2 id=\"\u4e00defer\u7684\u7b80\u5355\u4f7f\u7528\">\u4e00\u3001defer\u7684\u7b80\u5355\u4f7f\u7528\n<\/h2><p><code>defer<\/code> \u62e5\u6709\u6ce8\u518c\u5ef6\u8fdf\u8c03\u7528\u7684\u673a\u5236\uff0c<strong><code>defer<\/code> \u5173\u952e\u5b57\u540e\u9762\u8ddf\u968f\u7684\u8bed\u53e5\u6216\u8005\u51fd\u6570\uff0c\u4f1a\u5728\u5f53\u524d\u7684\u51fd\u6570<code>return<\/code> \u6b63\u5e38\u7ed3\u675f \u6216\u8005 <code>panic<\/code> \u5f02\u5e38\u7ed3\u675f \u540e\u6267\u884c\u3002<\/strong><\/p>\n<p>\u4f46\u662f<code>defer<\/code> \u53ea\u6709\u5728\u6ce8\u518c\u540e\uff0c\u6700\u540e\u624d\u80fd\u751f\u6548\u8c03\u7528\u6267\u884c\uff0c<code>return<\/code> \u4e4b\u540e\u7684<code>defer<\/code> \u8bed\u53e5\u662f\u4e0d\u4f1a\u6267\u884c\u7684\uff0c\u56e0\u4e3a\u5e76\u6ca1\u6709\u6ce8\u518c\u6210\u529f\u3002<\/p>\n<p>\u5982\u4e0b\u4f8b\u5b50\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">main<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">defer<\/span> <span class=\"kd\">func<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"nx\">fmt<\/span><span class=\"p\">.<\/span><span class=\"nf\">Println<\/span><span class=\"p\">(<\/span><span class=\"mi\">111<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"p\">}()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">fmt<\/span><span class=\"p\">.<\/span><span class=\"nf\">Println<\/span><span class=\"p\">(<\/span><span class=\"mi\">222<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">return<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">defer<\/span> <span class=\"kd\">func<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"nx\">fmt<\/span><span class=\"p\">.<\/span><span class=\"nf\">Println<\/span><span class=\"p\">(<\/span><span class=\"mi\">333<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"p\">}()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>\u6267\u884c\u7ed3\u679c\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"mi\">222<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"mi\">111<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>\u89e3\u6790\uff1a<code>222<\/code> \u3001<code>111<\/code> \u662f\u5728<code>return<\/code> \u4e4b\u524d\u6ce8\u518c\u7684\uff0c\u6240\u4ee5\u5982\u671f\u6267\u884c\uff0c<code>333<\/code> \u662f\u5728<code>return <\/code> \u4e4b\u540e\u6ce8\u518c\u7684\uff0c\u6ce8\u518c\u5931\u8d25\uff0c\u6267\u884c\u4e0d\u4e86\u3002<\/p>\n<p><code>defer<\/code> \u5728\u9700\u8981\u8d44\u6e90\u91ca\u653e\u7684\u573a\u666f\u975e\u5e38\u6709\u7528\uff0c\u53ef\u4ee5\u5f88\u65b9\u4fbf\u5730\u5728\u51fd\u6570\u7ed3\u675f\u524d\u6267\u884c\u4e00\u4e9b\u64cd\u4f5c\u3002<\/p>\n<p>\u6bd4\u5982\u5728 \u6253\u5f00\u8fde\u63a5\/\u5173\u95ed\u8fde\u63a5 \u3001\u52a0\u9501\/\u91ca\u653e\u9501\u3001\u6253\u5f00\u6587\u4ef6\/\u5173\u95ed\u6587\u4ef6 \u8fd9\u4e9b\u573a\u666f\u4e0b\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"nx\">file<\/span><span class=\"p\">,<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">os<\/span><span class=\"p\">.<\/span><span class=\"nf\">Open<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;1.txt&#34;<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">if<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">nil<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">    <span class=\"nb\">panic<\/span><span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">if<\/span> <span class=\"nx\">file<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">nil<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">    <span class=\"k\">defer<\/span> <span class=\"nx\">file<\/span><span class=\"p\">.<\/span><span class=\"nf\">Close<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>\u8fd9\u91cc\u8981\u6ce8\u610f\u7684\u662f\uff1a\u5728\u8c03\u7528<code>file.Close()<\/code> \u4e4b\u524d\uff0c\u9700\u8981\u5224\u65ad<code>file<\/code> \u662f\u5426\u4e3a\u7a7a\uff0c\u907f\u514d\u51fa\u73b0\u5f02\u5e38\u60c5\u51b5\u3002<\/p>\n<p>\u518d\u6765\u770b\u4e00\u4e2a\u9519\u8bef\u793a\u8303\uff0c\u6ca1\u6709\u6b63\u786e\u4f7f\u7528<code>defer<\/code> \u7684\u4f8b\u5b50\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"nx\">player<\/span><span class=\"p\">.<\/span><span class=\"nx\">mu<\/span><span class=\"p\">.<\/span><span class=\"nf\">Lock<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">rand<\/span><span class=\"p\">.<\/span><span class=\"nf\">Intn<\/span><span class=\"p\">(<\/span><span class=\"nx\">number<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">player<\/span><span class=\"p\">.<\/span><span class=\"nx\">mu<\/span><span class=\"p\">.<\/span><span class=\"nf\">Unlock<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>\u8fd9\u4e09\u884c\u4ee3\u7801\uff0c\u5b58\u5728\u4e24\u4e2a\u95ee\u9898\uff1a\n1. \u4e2d\u95f4\u8fd9\u884c\u4ee3\u7801<code> rand.Intn(number)<\/code> \u662f\u6709\u53ef\u80fd\u53d1\u751f<code>panic<\/code> \u7684\uff0c\u8fd9\u5c31\u4f1a\u5bfc\u81f4\u6ca1\u6709\u6b63\u5e38\u89e3\u9501\u3002\n2. \u8fd9\u6837\u7684\u4ee3\u7801\u5728\u9879\u76ee\u4e2d\u540e\u7eed\u53ef\u80fd\u88ab\u5176\u4ed6\u4eba\u4fee\u6539\uff0c\u5728<code>rand.Intn(number)<\/code> \u540e\u589e\u52a0\u66f4\u591a\u7684\u903b\u8f91\uff0c\u8fd9\u662f\u5b8c\u5168\u4e0d\u53ef\u63a7\u7684\u3002<\/p>\n<p>\u5728<code>Lock<\/code> \u548c <code>Unlock<\/code> \u4e4b\u95f4\u7684\u4ee3\u7801\u4e00\u65e6\u51fa\u73b0 <code>panic<\/code> \uff0c\u5c31\u4f1a\u9020\u6210\u6b7b\u9501\u3002\u56e0\u6b64\uff0c\u5373\u4f7f\u903b\u8f91\u975e\u5e38\u7b80\u5355\uff0c\u4f7f\u7528<code>defer<\/code> \u4e5f\u662f\u5f88\u6709\u5fc5\u8981\u7684\uff0c\u56e0\u4e3a\u9700\u6c42\u603b\u5728\u53d8\u5316\uff0c\u4ee3\u7801\u4e5f\u603b\u4f1a\u88ab\u4fee\u6539\u3002<\/p>\n<hr>\n<h2 id=\"\u4e8cdefer\u7684\u51fd\u6570\u53c2\u6570\u4e0e\u95ed\u5305\u5f15\u7528\">\u4e8c\u3001defer\u7684\u51fd\u6570\u53c2\u6570\u4e0e\u95ed\u5305\u5f15\u7528\n<\/h2><p><code>defer<\/code> \u5ef6\u8fdf\u8bed\u53e5\u4e0d\u4f1a\u9a6c\u4e0a\u6267\u884c\uff0c\u800c\u662f\u4f1a\u8fdb\u5165\u4e00\u4e2a\u6808\uff0c\u51fd\u6570<code>return<\/code> \u524d\uff0c\u4f1a\u6309<strong>\u5148\u8fdb\u540e\u51fa<\/strong>\u7684\u987a\u5e8f\u6267\u884c\u3002<\/p>\n<p>\u5148\u8fdb\u540e\u51fa\u7684\u539f\u56e0\u662f\u540e\u9762\u5b9a\u4e49\u7684\u51fd\u6570\u53ef\u80fd\u4f1a\u4f9d\u8d56\u524d\u9762\u7684\u8d44\u6e90\uff0c\u81ea\u7136\u8981\u5148\u6267\u884c\uff1b\u5426\u5219\uff0c\u5982\u679c\u524d\u9762\u7684\u5148\u6267\u884c\u4e86\uff0c\u90a3\u4e48\u540e\u9762\u51fd\u6570\u7684\u4f9d\u8d56\u5c31\u6ca1\u6709\u4e86\uff0c\u5c31\u53ef\u80fd\u4f1a\u5bfc\u81f4\u51fa\u9519\u3002<\/p>\n<p><u><font color=*#0099ff size=4 face=\"\u9ed1\u4f53\">\u5728<code>defer<\/code> \u51fd\u6570\u5b9a\u4e49\u65f6\uff0c\u5bf9\u5916\u90e8\u53d8\u91cf\u7684\u5f15\u7528\u6709\u4e09\u79cd\u65b9\u5f0f\uff1a\u503c\u4f20\u53c2\u3001\u6307\u9488\u4f20\u53c2\u3001\u95ed\u5305\u5f15\u7528\u3002<\/font><\/u><\/p>\n<ol>\n<li><strong>\u503c\u4f20\u53c2\uff1a\u5728<code>defer<\/code> \u5b9a\u4e49\u65f6\u5c31\u628a\u503c\u4f20\u9012\u7ed9<code>defer<\/code> \uff0c\u5e76\u590d\u5236\u4e00\u4efdcache\u8d77\u6765\uff0cdefer\u8c03\u7528\u65f6\u548c\u5b9a\u4e49\u7684\u65f6\u5019\u503c\u662f\u4e00\u81f4\u7684\u3002<\/strong><\/li>\n<li><strong>\u6307\u9488\u4f20\u53c2\uff1a\u5728<code>defer<\/code> \u5b9a\u4e49\u65f6\u5c31\u628a\u6307\u9488\u4f20\u9012\u7ed9<code>defer<\/code> \uff0cdefer\u8c03\u7528\u65f6\u6839\u636e\u6574\u4e2a\u4e0a\u4e0b\u6587\u786e\u5b9a\u53c2\u6570\u5f53\u524d\u7684\u503c\u3002<\/strong><\/li>\n<li><strong>\u95ed\u5305\u5f15\u7528\uff1a\u5728<code>defer<\/code> \u5b9a\u4e49\u65f6\u5c31\u628a\u503c\u5f15\u7528\u4f20\u9012\u7ed9<code>defer<\/code> \uff0cdefer\u8c03\u7528\u65f6\u6839\u636e\u6574\u4e2a\u4e0a\u4e0b\u6587\u786e\u5b9a\u53c2\u6570\u5f53\u524d\u7684\u503c\u3002<\/strong><\/li>\n<\/ol>\n<p>\u4e0b\u9762\u901a\u8fc7\u4f8b\u5b50\u52a0\u6df1\u4e00\u4e0b\u7406\u89e3\u3002<\/p>\n<p>\u4f8b\u5b501\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">main<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"kd\">var<\/span> <span class=\"nx\">arr<\/span> <span class=\"p\">[<\/span><span class=\"mi\">4<\/span><span class=\"p\">]<\/span><span class=\"kd\">struct<\/span><span class=\"p\">{}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">for<\/span> <span class=\"nx\">i<\/span> <span class=\"o\">:=<\/span> <span class=\"k\">range<\/span> <span class=\"nx\">arr<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"k\">defer<\/span> <span class=\"kd\">func<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t\t<span class=\"nx\">fmt<\/span><span class=\"p\">.<\/span><span class=\"nf\">Println<\/span><span class=\"p\">(<\/span><span class=\"nx\">i<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"p\">}()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>\u6267\u884c\u7ed3\u679c\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"mi\">3<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"mi\">3<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"mi\">3<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"mi\">3<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>\u89e3\u6790\uff1a\u56e0\u4e3a<code>defer<\/code> \u540e\u9762\u8ddf\u7740\u7684\u662f\u4e00\u4e2a\u95ed\u5305\uff0c\u6839\u636e\u6574\u4e2a\u4e0a\u4e0b\u6587\u786e\u5b9a\uff0c<code>for<\/code> \u5faa\u73af\u7ed3\u675f\u540e<code>i<\/code> \u7684\u503c\u4e3a3\uff0c\u56e0\u6b64\u6700\u540e\u6253\u5370\u4e864\u4e2a3\u3002<\/p>\n<p>\u4f8b\u5b502\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">main<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"kd\">var<\/span> <span class=\"nx\">n<\/span> <span class=\"kt\">int<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"c1\">\/\/ \u503c\u4f20\u53c2<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">defer<\/span> <span class=\"kd\">func<\/span><span class=\"p\">(<\/span><span class=\"nx\">n1<\/span> <span class=\"kt\">int<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"nx\">fmt<\/span><span class=\"p\">.<\/span><span class=\"nf\">Println<\/span><span class=\"p\">(<\/span><span class=\"nx\">n1<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"p\">}(<\/span><span class=\"nx\">n<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"c1\">\/\/ \u6307\u9488\u4f20\u53c2<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">defer<\/span> <span class=\"kd\">func<\/span><span class=\"p\">(<\/span><span class=\"nx\">n2<\/span> <span class=\"o\">*<\/span><span class=\"kt\">int<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"nx\">fmt<\/span><span class=\"p\">.<\/span><span class=\"nf\">Println<\/span><span class=\"p\">(<\/span><span class=\"o\">*<\/span><span class=\"nx\">n2<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"p\">}(<\/span><span class=\"o\">&amp;<\/span><span class=\"nx\">n<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"c1\">\/\/ \u95ed\u5305<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">defer<\/span> <span class=\"kd\">func<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"nx\">fmt<\/span><span class=\"p\">.<\/span><span class=\"nf\">Println<\/span><span class=\"p\">(<\/span><span class=\"nx\">n<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"p\">}()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">n<\/span> <span class=\"p\">=<\/span> <span class=\"mi\">4<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>\u6267\u884c\u7ed3\u679c\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"mi\">4<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"mi\">4<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"mi\">0<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>\u89e3\u6790\uff1a<\/p>\n<p><code>defer<\/code> \u6267\u884c\u987a\u5e8f\u548c\u5b9a\u4e49\u7684\u987a\u5e8f\u662f\u76f8\u53cd\u7684\uff1b<\/p>\n<p>\u7b2c\u4e09\u4e2a<code>defer<\/code> \u8bed\u53e5\u662f\u95ed\u5305\uff0c\u5f15\u7528\u7684\u5916\u90e8\u53d8\u91cf<code>n<\/code> \uff0cdefer\u8c03\u7528\u65f6\u6839\u636e\u4e0a\u4e0b\u6587\u786e\u5b9a\uff0c\u6700\u7ec8\u7ed3\u679c\u662f4\uff1b<\/p>\n<p>\u7b2c\u4e8c\u4e2a<code>defer<\/code> \u8bed\u53e5\u662f\u6307\u9488\u4f20\u53c2\uff0cdefer\u8c03\u7528\u65f6\u6839\u636e\u6574\u4e2a\u4e0a\u4e0b\u6587\u786e\u5b9a\u53c2\u6570\u5f53\u524d\u7684\u503c\uff0c\u6700\u7ec8\u7ed3\u679c\u662f4\uff1b<\/p>\n<p>\u7b2c\u4e00\u4e2a<code>defer<\/code> \u8bed\u53e5\u662f\u503c\u4f20\u53c2\uff0cdefer\u8c03\u7528\u65f6\u548c\u5b9a\u4e49\u7684\u65f6\u5019\u503c\u662f\u4e00\u81f4\u7684\uff0c\u6700\u7ec8\u7ed3\u679c\u662f0\uff1b<\/p>\n<p>\u4f8b\u5b503\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">main<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"c1\">\/\/ \u6587\u4ef61<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">f<\/span><span class=\"p\">,<\/span> <span class=\"nx\">_<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">os<\/span><span class=\"p\">.<\/span><span class=\"nf\">Open<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;1.txt&#34;<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">if<\/span> <span class=\"nx\">f<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">nil<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"k\">defer<\/span> <span class=\"kd\">func<\/span><span class=\"p\">(<\/span><span class=\"nx\">f<\/span> <span class=\"nx\">io<\/span><span class=\"p\">.<\/span><span class=\"nx\">Closer<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t\t<span class=\"k\">if<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">f<\/span><span class=\"p\">.<\/span><span class=\"nf\">Close<\/span><span class=\"p\">();<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">nil<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t\t\t<span class=\"nx\">fmt<\/span><span class=\"p\">.<\/span><span class=\"nf\">Printf<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;defer close file err 1 %v\\n&#34;<\/span><span class=\"p\">,<\/span> <span class=\"nx\">err<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t\t<span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"p\">}(<\/span><span class=\"nx\">f<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"c1\">\/\/ \u6587\u4ef62<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">f<\/span><span class=\"p\">,<\/span> <span class=\"nx\">_<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">os<\/span><span class=\"p\">.<\/span><span class=\"nf\">Open<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;2.txt&#34;<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">if<\/span> <span class=\"nx\">f<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">nil<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"k\">defer<\/span> <span class=\"kd\">func<\/span><span class=\"p\">(<\/span><span class=\"nx\">f<\/span> <span class=\"nx\">io<\/span><span class=\"p\">.<\/span><span class=\"nx\">Closer<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t\t<span class=\"k\">if<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">f<\/span><span class=\"p\">.<\/span><span class=\"nf\">Close<\/span><span class=\"p\">();<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">nil<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t\t\t<span class=\"nx\">fmt<\/span><span class=\"p\">.<\/span><span class=\"nf\">Printf<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;defer close file err 2 %v\\n&#34;<\/span><span class=\"p\">,<\/span> <span class=\"nx\">err<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t\t<span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"p\">}(<\/span><span class=\"nx\">f<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">fmt<\/span><span class=\"p\">.<\/span><span class=\"nf\">Println<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;success&#34;<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>\u6267\u884c\u7ed3\u679c\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"nx\">success<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>\u89e3\u6790\uff1a\u5148\u8bf4\u7ed3\u8bba\uff0c\u8fd9\u4e2a\u4f8b\u5b50\u7684\u4ee3\u7801\u6ca1\u6709\u95ee\u9898\uff0c\u4e24\u4e2a\u6587\u4ef6\u90fd\u4f1a\u88ab\u6210\u529f\u5173\u95ed\u3002\u8fd9\u4e2a\u662f\u5bf9<code>defer<\/code> \u539f\u7406\u7684\u5e94\u7528\uff0c\u56e0\u4e3a<code>defer<\/code> \u51fd\u6570\u5728\u5b9a\u4e49\u7684\u65f6\u5019\uff0c\u53c2\u6570\u5c31\u5df2\u7ecf\u590d\u5236\u8fdb\u53bb\u4e86\uff0c\u8fd9\u91cc\u662f\u503c\u4f20\u53c2\uff0c\u771f\u6b63\u6267\u884c<code>close()<\/code> \u51fd\u6570\u7684\u65f6\u5019\u5c31\u521a\u597d\u5173\u95ed\u7684\u662f\u6b63\u786e\u7684\u6587\u4ef6\u3002\u5982\u679c\u4e0d\u628a<code>f<\/code> \u5f53\u505a\u503c\u4f20\u53c2\uff0c\u6700\u540e\u4e24\u4e2a<code>close()<\/code> \u51fd\u6570\u5173\u95ed\u7684\u5c31\u662f\u540c\u4e00\u4e2a\u6587\u4ef6\u4e86\uff0c\u90fd\u662f\u6700\u540e\u6253\u5f00\u7684\u90a3\u4e2a\u6587\u4ef6\u3002<\/p>\n<p>\u4f8b\u5b503\u7684\u9519\u8bef\u793a\u8303\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">main<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"c1\">\/\/ \u6587\u4ef61<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">f<\/span><span class=\"p\">,<\/span> <span class=\"nx\">_<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">os<\/span><span class=\"p\">.<\/span><span class=\"nf\">Open<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;1.txt&#34;<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">if<\/span> <span class=\"nx\">f<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">nil<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"k\">defer<\/span> <span class=\"kd\">func<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t\t<span class=\"k\">if<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">f<\/span><span class=\"p\">.<\/span><span class=\"nf\">Close<\/span><span class=\"p\">();<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">nil<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t\t\t<span class=\"nx\">fmt<\/span><span class=\"p\">.<\/span><span class=\"nf\">Printf<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;defer close file err 1 %v\\n&#34;<\/span><span class=\"p\">,<\/span> <span class=\"nx\">err<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t\t<span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"p\">}()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"c1\">\/\/ \u6587\u4ef62<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">f<\/span><span class=\"p\">,<\/span> <span class=\"nx\">_<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">os<\/span><span class=\"p\">.<\/span><span class=\"nf\">Open<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;2.txt&#34;<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">if<\/span> <span class=\"nx\">f<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">nil<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"k\">defer<\/span> <span class=\"kd\">func<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t\t<span class=\"k\">if<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">f<\/span><span class=\"p\">.<\/span><span class=\"nf\">Close<\/span><span class=\"p\">();<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">nil<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t\t\t<span class=\"nx\">fmt<\/span><span class=\"p\">.<\/span><span class=\"nf\">Printf<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;defer close file err 2 %v\\n&#34;<\/span><span class=\"p\">,<\/span> <span class=\"nx\">err<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t\t<span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"p\">}()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">fmt<\/span><span class=\"p\">.<\/span><span class=\"nf\">Println<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;success&#34;<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>\u6267\u884c\u7ed3\u679c\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"nx\">success<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"k\">defer<\/span> <span class=\"nx\">close<\/span> <span class=\"nx\">file<\/span> <span class=\"nx\">err<\/span> <span class=\"mi\">1<\/span> <span class=\"nx\">close<\/span> <span class=\"mf\">2.<\/span><span class=\"nx\">txt<\/span><span class=\"p\">:<\/span> <span class=\"nx\">file<\/span> <span class=\"nx\">already<\/span> <span class=\"nx\">closed<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>\u4f8b\u5b504\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u503c\u4f20\u53c2<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">func1<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"kd\">var<\/span> <span class=\"nx\">err<\/span> <span class=\"kt\">error<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">defer<\/span> <span class=\"nx\">fmt<\/span><span class=\"p\">.<\/span><span class=\"nf\">Println<\/span><span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">err<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">errors<\/span><span class=\"p\">.<\/span><span class=\"nf\">New<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;func1 error&#34;<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">return<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u95ed\u5305<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">func2<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"kd\">var<\/span> <span class=\"nx\">err<\/span> <span class=\"kt\">error<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">defer<\/span> <span class=\"kd\">func<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"nx\">fmt<\/span><span class=\"p\">.<\/span><span class=\"nf\">Println<\/span><span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"p\">}()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">err<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">errors<\/span><span class=\"p\">.<\/span><span class=\"nf\">New<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;func2 error&#34;<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">return<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u503c\u4f20\u53c2<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">func3<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"kd\">var<\/span> <span class=\"nx\">err<\/span> <span class=\"kt\">error<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">defer<\/span> <span class=\"kd\">func<\/span><span class=\"p\">(<\/span><span class=\"nx\">err<\/span> <span class=\"kt\">error<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"nx\">fmt<\/span><span class=\"p\">.<\/span><span class=\"nf\">Println<\/span><span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"p\">}(<\/span><span class=\"nx\">err<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">err<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">errors<\/span><span class=\"p\">.<\/span><span class=\"nf\">New<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;func3 error&#34;<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">return<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ \u6307\u9488\u4f20\u53c2<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">func4<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"kd\">var<\/span> <span class=\"nx\">err<\/span> <span class=\"kt\">error<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">defer<\/span> <span class=\"kd\">func<\/span><span class=\"p\">(<\/span><span class=\"nx\">err<\/span> <span class=\"o\">*<\/span><span class=\"kt\">error<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"nx\">fmt<\/span><span class=\"p\">.<\/span><span class=\"nf\">Println<\/span><span class=\"p\">(<\/span><span class=\"o\">*<\/span><span class=\"nx\">err<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"p\">}(<\/span><span class=\"o\">&amp;<\/span><span class=\"nx\">err<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">err<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">errors<\/span><span class=\"p\">.<\/span><span class=\"nf\">New<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;func4 error&#34;<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">return<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">main<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nf\">func1<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nf\">func2<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nf\">func3<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nf\">func4<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>\u6267\u884c\u7ed3\u679c\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"p\">&lt;<\/span><span class=\"kc\">nil<\/span><span class=\"p\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">func2<\/span> <span class=\"kt\">error<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">&lt;<\/span><span class=\"kc\">nil<\/span><span class=\"p\">&gt;<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">func4<\/span> <span class=\"kt\">error<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>\u89e3\u6790\uff1a<\/p>\n<p>\u7b2c\u4e00\u4e2a\u548c\u7b2c\u4e09\u4e2a\u51fd\u6570\u4e2d\uff0c\u90fd\u662f\u4f5c\u4e3a\u53c2\u6570\uff0c\u8fdb\u884c\u503c\u4f20\u53c2\uff0c<code>err<\/code> \u5728\u5b9a\u4e49\u7684\u65f6\u5019\u5c31\u4f1a\u6c42\u503c\uff0c\u56e0\u4e3a\u5b9a\u4e49\u7684\u65f6\u5019\u503c\u90fd\u662f<code>nil<\/code> \uff0c\u6240\u4ee5\u6700\u540e\u7684\u7ed3\u679c\u90fd\u662f<code>nil<\/code> \uff1b<\/p>\n<p>\u7b2c\u4e8c\u4e2a\u51fd\u6570\u7684\u53c2\u6570\u5728\u5b9a\u4e49\u7684\u65f6\u5019\u4e5f\u6c42\u503c\u4e86\uff0c\u4f46\u662f\u5b83\u662f\u4e2a\u95ed\u5305\uff0c\u67e5\u770b\u4e0a\u4e0b\u6587\u53d1\u73b0\u6700\u540e\u503c\u88ab\u4fee\u6539\u4e3a<code>func2 error<\/code> \uff1b<\/p>\n<p>\u7b2c\u56db\u4e2a\u51fd\u6570\u662f\u6307\u9488\u4f20\u53c2\uff0c\u6700\u540e\u503c\u88ab\u4fee\u6539\u4e3a<code>func4 error<\/code> \uff1b<\/p>\n<p><strong>\u73b0\u5b9e\u4e2d\uff0c\u7b2c\u4e09\u4e2a\u51fd\u6570\u95ed\u5305\u7684\u4f8b\u5b50\u662f\u6bd4\u8f83\u5bb9\u6613\u72af\u7684\u9519\u8bef\uff0c\u5bfc\u81f4\u6700\u540e<code>defer<\/code> \u8bed\u53e5\u6ca1\u6709\u8d77\u5230\u4f5c\u7528\uff0c\u9020\u6210\u751f\u4ea7\u4e0a\u7684\u4e8b\u6545\uff0c\u9700\u8981\u7279\u522b\u6ce8\u610f\u3002<\/strong><\/p>\n<hr>\n<h2 id=\"\u4e09defer\u7684\u8bed\u53e5\u62c6\u89e3\">\u4e09\u3001defer\u7684\u8bed\u53e5\u62c6\u89e3\n<\/h2><p>\u4ece\u8fd4\u56de\u503c\u51fa\u53d1\u6765\u62c6\u89e3\u5ef6\u8fdf\u8bed\u53e5 <code>defer<\/code> \u3002<\/p>\n<p>\u200b\t<code>return xxx<\/code><\/p>\n<p>\u8fd9\u6761\u8bed\u53e5\u7ecf\u8fc7\u7f16\u8bd1\u4e4b\u540e\uff0c\u5b9e\u9645\u4e0a\u751f\u6210\u4e86\u4e09\u6761\u6307\u4ee4\uff1a<\/p>\n<ol>\n<li><strong>\u8fd4\u56de\u503c = xxx<\/strong><\/li>\n<li><strong>\u8c03\u7528 defer \u51fd\u6570<\/strong><\/li>\n<li><strong>\u7a7a\u7684 return<\/strong><\/li>\n<\/ol>\n<p>\u5176\u4e2d\uff0c<code>1<\/code> \u548c <code>3<\/code> \u662f<code>return<\/code> \u8bed\u53e5\u751f\u6210\u7684\u6307\u4ee4\uff0c<code>2<\/code> \u662f<code>defer<\/code> \u8bed\u53e5\u751f\u6210\u7684\u6307\u4ee4\u3002\u53ef\u4ee5\u770b\u51fa\uff1a<\/p>\n<p><strong><code>return<\/code> \u5e76\u4e0d\u662f\u4e00\u6761\u539f\u5b50\u6307\u4ee4\uff1b<code>defer<\/code> \u8bed\u53e5\u5728\u7b2c\u4e8c\u6b65\u8c03\u7528\uff0c\u8fd9\u91cc\u53ef\u80fd\u64cd\u4f5c\u8fd4\u56de\u503c\uff0c\u4ece\u800c\u5f71\u54cd\u6700\u7ec8\u7ed3\u679c\u3002<\/strong><\/p>\n<p>\u63a5\u4e0b\u6765\u901a\u8fc7\u4f8b\u5b50\u6765\u52a0\u6df1\u7406\u89e3\u3002<\/p>\n<p>\u4f8b\u5b501\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">func1<\/span><span class=\"p\">()<\/span> <span class=\"p\">(<\/span><span class=\"nx\">r<\/span> <span class=\"kt\">int<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">t<\/span> <span class=\"o\">:=<\/span> <span class=\"mi\">3<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">defer<\/span> <span class=\"kd\">func<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"nx\">t<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">t<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">3<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"p\">}()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">return<\/span> <span class=\"nx\">t<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">main<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">r<\/span> <span class=\"o\">:=<\/span> <span class=\"nf\">func1<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">fmt<\/span><span class=\"p\">.<\/span><span class=\"nf\">Println<\/span><span class=\"p\">(<\/span><span class=\"nx\">r<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>\u6267\u884c\u7ed3\u679c\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"mi\">3<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>\u8bed\u53e5\u62c6\u89e3\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">func1<\/span><span class=\"p\">()<\/span> <span class=\"p\">(<\/span><span class=\"nx\">r<\/span> <span class=\"kt\">int<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">t<\/span> <span class=\"o\">:=<\/span> <span class=\"mi\">3<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"c1\">\/\/ 1.\u8fd4\u56de\u503c=xxx\uff1a\u8d4b\u503c\u6307\u4ee4<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">r<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">t<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"c1\">\/\/ 2.\u8c03\u7528defer\u51fd\u6570\uff1adefer\u5728\u8d4b\u503c\u4e0e\u8fd4\u56de\u4e4b\u524d\u6267\u884c\uff0c\u8fd9\u4e2a\u4f8b\u5b50\u4e2d\u8fd4\u56de\u503cr\u6ca1\u6709\u88ab\u4fee\u6539\u8fc7<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"kd\">func<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"nx\">t<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">t<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">3<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"p\">}()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"c1\">\/\/ 3.\u7a7a\u7684return<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">return<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">main<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">r<\/span> <span class=\"o\">:=<\/span> <span class=\"nf\">func1<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">fmt<\/span><span class=\"p\">.<\/span><span class=\"nf\">Println<\/span><span class=\"p\">(<\/span><span class=\"nx\">r<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>\u89e3\u6790\uff1a\u56e0\u4e3a\u7b2c\u4e8c\u4e2a\u6b65\u9aa4\u91cc\u5e76\u6ca1\u6709\u64cd\u4f5c\u8fd4\u56de\u503c<code>r<\/code> \uff0c\u6240\u4ee5\u6700\u7ec8\u5f97\u5230\u7684\u7ed3\u679c\u662f<code>3<\/code> \u3002<\/p>\n<p>\u4f8b\u5b502\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">func2<\/span><span class=\"p\">()<\/span> <span class=\"p\">(<\/span><span class=\"nx\">r<\/span> <span class=\"kt\">int<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">defer<\/span> <span class=\"kd\">func<\/span><span class=\"p\">(<\/span><span class=\"nx\">r<\/span> <span class=\"kt\">int<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"nx\">r<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">r<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">3<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"p\">}(<\/span><span class=\"nx\">r<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">return<\/span> <span class=\"mi\">1<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">main<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">r<\/span> <span class=\"o\">:=<\/span> <span class=\"nf\">func2<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">fmt<\/span><span class=\"p\">.<\/span><span class=\"nf\">Println<\/span><span class=\"p\">(<\/span><span class=\"nx\">r<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>\u6267\u884c\u7ed3\u679c\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"mi\">1<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>\u8bed\u53e5\u62c6\u89e3\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">func2<\/span><span class=\"p\">()<\/span> <span class=\"p\">(<\/span><span class=\"nx\">r<\/span> <span class=\"kt\">int<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"c1\">\/\/ 1.\u8fd4\u56de\u503c=xxx\uff1a\u8d4b\u503c\u6307\u4ee4<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">r<\/span> <span class=\"p\">=<\/span> <span class=\"mi\">1<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"c1\">\/\/ 2.\u8c03\u7528defer\u51fd\u6570\uff1a\u56e0\u4e3a\u662f\u503c\u4f20\u53c2\uff0c\u6240\u4ee5\u4fee\u6539\u7684r\u662f\u4e2a\u590d\u5236\u7684\u503c\uff0c\u4e0d\u4f1a\u5f71\u54cd\u8981\u8fd4\u56de\u7684\u90a3\u4e2ar\u503c\u3002<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"kd\">func<\/span><span class=\"p\">(<\/span><span class=\"nx\">r<\/span> <span class=\"kt\">int<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"nx\">r<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">r<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">3<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"p\">}(<\/span><span class=\"nx\">r<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"c1\">\/\/ 3.\u7a7a\u7684return<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">return<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">main<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">r<\/span> <span class=\"o\">:=<\/span> <span class=\"nf\">func2<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">fmt<\/span><span class=\"p\">.<\/span><span class=\"nf\">Println<\/span><span class=\"p\">(<\/span><span class=\"nx\">r<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>\u89e3\u6790\uff1a\u56e0\u4e3a\u7b2c\u4e8c\u4e2a\u6b65\u9aa4\u91cc\u6539\u53d8\u7684\u662f\u4f20\u503c\u8fdb\u53bb\u7684<code>r<\/code> \u503c\uff0c\u662f\u4e00\u4e2a\u5f62\u53c2\u7684\u590d\u5236\u503c\uff0c\u4e0d\u4f1a\u5f71\u54cd\u5b9e\u53c2<code>r<\/code> \uff0c\u6240\u4ee5\u6700\u7ec8\u5f97\u5230\u7684\u7ed3\u679c\u662f<code>1<\/code> \u3002<\/p>\n<p>\u4f8b\u5b503\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">func3<\/span><span class=\"p\">()<\/span> <span class=\"p\">(<\/span><span class=\"nx\">r<\/span> <span class=\"kt\">int<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">defer<\/span> <span class=\"kd\">func<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"nx\">r<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">r<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">3<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"p\">}()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">return<\/span> <span class=\"mi\">1<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">main<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">r<\/span> <span class=\"o\">:=<\/span> <span class=\"nf\">func3<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">fmt<\/span><span class=\"p\">.<\/span><span class=\"nf\">Println<\/span><span class=\"p\">(<\/span><span class=\"nx\">r<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>\u6267\u884c\u7ed3\u679c\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"mi\">4<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>\u8bed\u53e5\u62c6\u89e3\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">func3<\/span><span class=\"p\">()<\/span> <span class=\"p\">(<\/span><span class=\"nx\">r<\/span> <span class=\"kt\">int<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"c1\">\/\/ 1.\u8fd4\u56de\u503c=xxx\uff1a\u8d4b\u503c\u6307\u4ee4<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">r<\/span> <span class=\"p\">=<\/span> <span class=\"mi\">1<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"c1\">\/\/ 2.\u8c03\u7528defer\u51fd\u6570\uff1a\u56e0\u4e3a\u662f\u95ed\u5305\uff0c\u6355\u83b7\u7684\u53d8\u91cf\u662f\u5f15\u7528\u4f20\u9012\uff0c\u6240\u4ee5\u4f1a\u4fee\u6539\u8fd4\u56de\u7684\u90a3\u4e2ar\u503c\u3002<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"kd\">func<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"nx\">r<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">r<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">3<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"p\">}()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"c1\">\/\/ 3.\u7a7a\u7684return<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">return<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">main<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">r<\/span> <span class=\"o\">:=<\/span> <span class=\"nf\">func3<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">fmt<\/span><span class=\"p\">.<\/span><span class=\"nf\">Println<\/span><span class=\"p\">(<\/span><span class=\"nx\">r<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>\u89e3\u6790\uff1a\u56e0\u4e3a\u7b2c\u4e8c\u4e2a\u6b65\u9aa4\u91cc\u6539\u53d8\u7684<code>r<\/code> \u503c\u662f\u95ed\u5305\uff0c\u95ed\u5305\u4e2d\u6355\u83b7\u7684\u53d8\u91cf\u662f\u5f15\u7528\u4f20\u9012\uff0c\u4e0d\u662f\u503c\u4f20\u9012\uff0c\u6240\u4ee5\u6700\u7ec8\u5f97\u5230\u7684\u7ed3\u679c\u662f<code>4<\/code> \u3002<\/p>\n<hr>\n<h2 id=\"\u56dbdefer\u4e2d\u7684recover\">\u56db\u3001defer\u4e2d\u7684recover\n<\/h2><p>\u4ee3\u7801\u4e2d\u7684<code>panic<\/code> \u6700\u7ec8\u4f1a\u88ab<code>recover<\/code> \u6355\u83b7\u5230\u3002\u5728\u65e5\u5e38\u5f00\u53d1\u4e2d\uff0c\u53ef\u80fd\u67d0\u4e00\u6761\u534f\u8bae\u7684\u903b\u8f91\u89e6\u53d1\u4e86\u67d0\u4e00\u4e2a<code>bug<\/code> \u9020\u6210<code>panic<\/code> \uff0c\u8fd9\u65f6\u5c31\u53ef\u4ee5\u7528<code>recover<\/code> \u53bb\u6355\u83b7<code>panic<\/code> \uff0c\u7a33\u4f4f\u4e3b\u6d41\u7a0b\uff0c\u4e0d\u5f71\u54cd\u5176\u4ed6\u534f\u8bae\u7684\u4e1a\u52a1\u903b\u8f91\u3002<\/p>\n<p>\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c<strong><code>recover<\/code> \u51fd\u6570\u53ea\u5728<code>defer<\/code> \u7684\u51fd\u6570\u4e2d\u76f4\u63a5\u8c03\u7528\u624d\u751f\u6548\u3002<\/strong><\/p>\n<p>\u901a\u8fc7\u4f8b\u5b50\u770b<code>recover<\/code> \u8c03\u7528\u60c5\u51b5\u3002<\/p>\n<p>\u4f8b\u5b501\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">func1<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">if<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"nb\">recover<\/span><span class=\"p\">();<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">nil<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"nx\">fmt<\/span><span class=\"p\">.<\/span><span class=\"nf\">Println<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;func1 recover&#34;<\/span><span class=\"p\">,<\/span> <span class=\"nx\">err<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"k\">return<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">main<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">defer<\/span> <span class=\"nf\">func1<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nb\">panic<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;func1 panic&#34;<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>\u6267\u884c\u7ed3\u679c\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"nx\">func1<\/span> <span class=\"nx\">recover<\/span> <span class=\"nx\">func1<\/span> <span class=\"nx\">panic<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>\u89e3\u6790\uff1a\u6b63\u786e<code>recover<\/code> \uff0c\u56e0\u4e3a\u5728<code>defer<\/code> \u4e2d\u8c03\u7528\u7684\uff0c\u6240\u4ee5\u53ef\u4ee5\u751f\u6548\u3002<\/p>\n<p>\u4f8b\u5b502\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">main<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nb\">recover<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nb\">panic<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;func2 panic&#34;<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>\u6267\u884c\u7ed3\u679c\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"nx\">panic<\/span><span class=\"p\">:<\/span> <span class=\"nx\">func2<\/span> <span class=\"nx\">panic<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">goroutine<\/span> <span class=\"mi\">1<\/span> <span class=\"p\">[<\/span><span class=\"nx\">running<\/span><span class=\"p\">]:<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">main<\/span><span class=\"p\">.<\/span><span class=\"nf\">main<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">C<\/span><span class=\"p\">:<\/span><span class=\"o\">\/<\/span><span class=\"nx\">Users<\/span><span class=\"o\">\/<\/span><span class=\"nx\">ycz<\/span><span class=\"o\">\/<\/span><span class=\"k\">go<\/span><span class=\"o\">\/<\/span><span class=\"nx\">ccc<\/span><span class=\"p\">.<\/span><span class=\"k\">go<\/span><span class=\"p\">:<\/span><span class=\"mi\">5<\/span> <span class=\"o\">+<\/span><span class=\"mh\">0x31<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">exit<\/span> <span class=\"nx\">status<\/span> <span class=\"mi\">2<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>\u89e3\u6790\uff1a\u9519\u8bef<code>recover<\/code> \uff0c\u76f4\u63a5\u8c03\u7528<code>recover<\/code> \uff0c\u8fd4\u56de<code>nil<\/code> \u3002<\/p>\n<p>\u4f8b\u5b503\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">main<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">defer<\/span> <span class=\"nb\">recover<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nb\">panic<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;func3 panic&#34;<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>\u6267\u884c\u7ed3\u679c\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"nx\">panic<\/span><span class=\"p\">:<\/span> <span class=\"nx\">func3<\/span> <span class=\"nx\">panic<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">goroutine<\/span> <span class=\"mi\">1<\/span> <span class=\"p\">[<\/span><span class=\"nx\">running<\/span><span class=\"p\">]:<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">main<\/span><span class=\"p\">.<\/span><span class=\"nf\">main<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">C<\/span><span class=\"p\">:<\/span><span class=\"o\">\/<\/span><span class=\"nx\">Users<\/span><span class=\"o\">\/<\/span><span class=\"nx\">ycz<\/span><span class=\"o\">\/<\/span><span class=\"k\">go<\/span><span class=\"o\">\/<\/span><span class=\"nx\">ccc<\/span><span class=\"p\">.<\/span><span class=\"k\">go<\/span><span class=\"p\">:<\/span><span class=\"mi\">5<\/span> <span class=\"o\">+<\/span><span class=\"mh\">0x65<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">exit<\/span> <span class=\"nx\">status<\/span> <span class=\"mi\">2<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>\u89e3\u6790\uff1a\u9519\u8bef<code>recover<\/code> \uff0c<code>recover<\/code> \u9700\u8981\u5728<code>defer<\/code> \u7684\u51fd\u6570\u91cc\u8c03\u7528\u3002<\/p>\n<p>\u4f8b\u5b504\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">main<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">defer<\/span> <span class=\"kd\">func<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"k\">defer<\/span> <span class=\"kd\">func<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t\t<span class=\"nb\">recover<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"p\">}()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"p\">}()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nb\">panic<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;func4 panic&#34;<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>\u6267\u884c\u7ed3\u679c\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"nx\">panic<\/span><span class=\"p\">:<\/span> <span class=\"nx\">func4<\/span> <span class=\"nx\">panic<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">goroutine<\/span> <span class=\"mi\">1<\/span> <span class=\"p\">[<\/span><span class=\"nx\">running<\/span><span class=\"p\">]:<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">main<\/span><span class=\"p\">.<\/span><span class=\"nf\">main<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">        <span class=\"nx\">C<\/span><span class=\"p\">:<\/span><span class=\"o\">\/<\/span><span class=\"nx\">Users<\/span><span class=\"o\">\/<\/span><span class=\"nx\">ycz<\/span><span class=\"o\">\/<\/span><span class=\"k\">go<\/span><span class=\"o\">\/<\/span><span class=\"nx\">ccc<\/span><span class=\"p\">.<\/span><span class=\"k\">go<\/span><span class=\"p\">:<\/span><span class=\"mi\">9<\/span> <span class=\"o\">+<\/span><span class=\"mh\">0x49<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">exit<\/span> <span class=\"nx\">status<\/span> <span class=\"mi\">2<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>\u89e3\u6790\uff1a\u9519\u8bef<code>recover<\/code> \uff0c\u4e0d\u80fd\u5728\u591a\u91cd<code>defer<\/code> \u5d4c\u5957\u91cc\u8c03\u7528<code>recover<\/code> \u3002<\/p>\n<p>\u53e6\u5916\u9700\u8981\u6ce8\u610f\u7684\u4e00\u70b9\u662f\uff0c<strong>\u7236<code>goroutine<\/code> \u65e0\u6cd5 <code>recover<\/code> \u4f4f \u5b50<code>goroutine<\/code> \u7684 <code>panic<\/code> \u3002<\/strong><\/p>\n<p>\u539f\u56e0\u662f\uff0c<code>goroutine<\/code> \u88ab\u8bbe\u8ba1\u4e3a\u4e00\u4e2a\u72ec\u7acb\u7684\u4ee3\u7801\u6267\u884c\u5355\u5143\uff0c\u62e5\u6709\u81ea\u5df1\u7684\u6267\u884c\u6808\uff0c\u4e0d\u4e0e\u5176\u4ed6<code>goroutine<\/code> \u5171\u4eab\u4efb\u4f55\u7684\u6570\u636e\u3002<\/p>\n<p>\u4e5f\u5c31\u662f\u8bf4\uff0c\u65e0\u6cd5\u8ba9<code>goroutine<\/code> \u62e5\u6709\u8fd4\u56de\u503c\uff0c\u4e5f\u65e0\u6cd5\u8ba9<code>goroutine<\/code> \u62e5\u6709\u81ea\u8eab\u7684<code>ID<\/code> \u7f16\u53f7\u3002<\/p>\n<p>\u5982\u679c\u5e0c\u671b\u6709\u4e00\u4e2a\u5168\u5c40\u7684<code>panic<\/code> \u6355\u83b7\u4e2d\u5fc3\uff0c\u90a3\u4e48\u53ef\u4ee5\u901a\u8fc7<code>channel<\/code> \u6765\u5b9e\u73b0\uff0c\u5982\u4e0b\u793a\u4f8b\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">var<\/span> <span class=\"nx\">panicNotifyManage<\/span> <span class=\"kd\">chan<\/span> <span class=\"kd\">interface<\/span><span class=\"p\">{}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">StartGlobalPanicRecover<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">panicNotifyManage<\/span> <span class=\"p\">=<\/span> <span class=\"nb\">make<\/span><span class=\"p\">(<\/span><span class=\"kd\">chan<\/span> <span class=\"kd\">interface<\/span><span class=\"p\">{})<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">go<\/span> <span class=\"kd\">func<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"k\">select<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"k\">case<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"o\">&lt;-<\/span><span class=\"nx\">panicNotifyManage<\/span><span class=\"p\">:<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t\t<span class=\"nx\">fmt<\/span><span class=\"p\">.<\/span><span class=\"nf\">Println<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;panicNotifyManage---&gt;&#34;<\/span><span class=\"p\">,<\/span> <span class=\"nx\">err<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"p\">}()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">GoSafe<\/span><span class=\"p\">(<\/span><span class=\"nx\">f<\/span> <span class=\"kd\">func<\/span><span class=\"p\">())<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">go<\/span> <span class=\"kd\">func<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"k\">defer<\/span> <span class=\"kd\">func<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t\t<span class=\"k\">if<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"nb\">recover<\/span><span class=\"p\">();<\/span> <span class=\"nx\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">nil<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t\t\t<span class=\"nx\">panicNotifyManage<\/span> <span class=\"o\">&lt;-<\/span> <span class=\"nx\">err<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t\t<span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"p\">}()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"nf\">f<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"p\">}()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">main<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nf\">StartGlobalPanicRecover<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">f1<\/span> <span class=\"o\">:=<\/span> <span class=\"kd\">func<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"nb\">panic<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;f1 panic&#34;<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nf\">GoSafe<\/span><span class=\"p\">(<\/span><span class=\"nx\">f1<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">time<\/span><span class=\"p\">.<\/span><span class=\"nf\">Sleep<\/span><span class=\"p\">(<\/span><span class=\"nx\">time<\/span><span class=\"p\">.<\/span><span class=\"nx\">Second<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>\u89e3\u6790\uff1a<code>GoSafe()<\/code> \u672c\u8d28\u4e0a\u662f\u5bf9<code>go<\/code> \u5173\u952e\u5b57\u8fdb\u884c\u4e86\u4e00\u5c42\u5c01\u88c5\uff0c\u786e\u4fdd\u5728\u6267\u884c\u5e76\u53d1\u5355\u5143\u524d\u63d2\u5165\u4e00\u4e2a<code>defer<\/code> \uff0c\u4ece\u800c\u4fdd\u8bc1\u80fd\u591f<code>recover<\/code> \u4f4f<code>panic<\/code> \u3002\u4f46\u662f\u8fd9\u4e2a\u65b9\u6848\u5e76\u4e0d\u5b8c\u7f8e\uff0c\u5982\u679c\u5f00\u53d1\u4eba\u5458\u4e0d\u4f7f\u7528<code>GoSafe<\/code> \u51fd\u6570\u6765\u521b\u5efa<code>goroutine<\/code> \uff0c\u800c\u662f\u81ea\u5df1\u521b\u5efa\uff0c\u5e76\u4e14\u5728\u4ee3\u7801\u4e2d\u51fa\u73b0\u4e86<code>panic<\/code> \uff0c\u90a3\u4e48\u4ecd\u7136\u4f1a\u9020\u6210\u7a0b\u5e8f\u5d29\u6e83\u3002<\/p>\n"},{"title":"rand","link":"https:\/\/hcraM41.github.io\/p\/rand\/","pubDate":"Sat, 10 May 2025 22:26:34 +0800","guid":"https:\/\/hcraM41.github.io\/p\/rand\/","description":"<img src=\"https:\/\/hcraM41.github.io\/p\/rand\/2.png\" alt=\"Featured image of post rand\" \/><h2 id=\"\u6e90\u7801\u5256\u6790\">\u6e90\u7801\u5256\u6790\n<\/h2><p>\u901a\u8fc7\u65e5\u5e38\u968f\u673a\u6570\u7684\u4ee3\u7801\u4f7f\u7528\uff0c\u770b\u4e0brank\u5305\u5177\u4f53\u7684\u5e95\u5c42\u5b9e\u73b0\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"nx\">r<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">rand<\/span><span class=\"p\">.<\/span><span class=\"nf\">New<\/span><span class=\"p\">(<\/span><span class=\"nx\">rand<\/span><span class=\"p\">.<\/span><span class=\"nf\">NewSource<\/span><span class=\"p\">(<\/span><span class=\"nx\">time<\/span><span class=\"p\">.<\/span><span class=\"nf\">Now<\/span><span class=\"p\">().<\/span><span class=\"nf\">UnixNano<\/span><span class=\"p\">()))<\/span> <span class=\"c1\">\/\/ \u521d\u59cb\u5316\u968f\u673a\u5668<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">r<\/span><span class=\"p\">.<\/span><span class=\"nf\">Intn<\/span><span class=\"p\">(<\/span><span class=\"mi\">314<\/span><span class=\"p\">)<\/span>\t<span class=\"c1\">\/\/ \u751f\u6210 [0, 314) \u5185\u7684\u6574\u6570<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p><strong>\u4ece<code>r := rand.New(rand.NewSource(time.Now().UnixNano()))<\/code> \u5f00\u59cb\u3002<\/strong><\/p>\n<p>\u521d\u59cb\u5316 Rand \u7684\u65f6\u5019\uff0c\u901a\u8fc7<code>rand.New(rand.NewSource(seed))<\/code>\u521b\u5efa\uff0c\u6240\u4ee5\u770b\u4e0b<code>rand.New()<\/code>\u7684\u5b9e\u73b0\u3002<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ New returns a new Rand that uses random values from src<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ to generate other random values.<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">New<\/span><span class=\"p\">(<\/span><span class=\"nx\">src<\/span> <span class=\"nx\">Source<\/span><span class=\"p\">)<\/span> <span class=\"o\">*<\/span><span class=\"nx\">Rand<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">s64<\/span><span class=\"p\">,<\/span> <span class=\"nx\">_<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">src<\/span><span class=\"p\">.(<\/span><span class=\"nx\">Source64<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">return<\/span> <span class=\"o\">&amp;<\/span><span class=\"nx\">Rand<\/span><span class=\"p\">{<\/span><span class=\"nx\">src<\/span><span class=\"p\">:<\/span> <span class=\"nx\">src<\/span><span class=\"p\">,<\/span> <span class=\"nx\">s64<\/span><span class=\"p\">:<\/span> <span class=\"nx\">s64<\/span><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>\u53ef\u4ee5\u770b\u5230 <strong>Rand<\/strong> \u4f7f\u7528\u7684\u662f<code>rand.NewSource()<\/code>\u4f20\u5165\u7684 <strong>Source<\/strong>\uff0c\u56e0\u6b64\u63a5\u7740\u770b\u4e0b<code>rand.NewSource()<\/code>\u7684\u5b9e\u73b0\u3002<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ NewSource returns a new pseudo-random Source seeded with the given value.<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ Unlike the default Source used by top-level functions, this source is not<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ safe for concurrent use by multiple goroutines.<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ The returned Source implements Source64.<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">NewSource<\/span><span class=\"p\">(<\/span><span class=\"nx\">seed<\/span> <span class=\"kt\">int64<\/span><span class=\"p\">)<\/span> <span class=\"nx\">Source<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">return<\/span> <span class=\"nf\">newSource<\/span><span class=\"p\">(<\/span><span class=\"nx\">seed<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">newSource<\/span><span class=\"p\">(<\/span><span class=\"nx\">seed<\/span> <span class=\"kt\">int64<\/span><span class=\"p\">)<\/span> <span class=\"o\">*<\/span><span class=\"nx\">rngSource<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"kd\">var<\/span> <span class=\"nx\">rng<\/span> <span class=\"nx\">rngSource<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">rng<\/span><span class=\"p\">.<\/span><span class=\"nf\">Seed<\/span><span class=\"p\">(<\/span><span class=\"nx\">seed<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">return<\/span> <span class=\"o\">&amp;<\/span><span class=\"nx\">rng<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>\u770b\u5230 <strong>Source<\/strong> \u7684\u5b9e\u9645\u7c7b\u578b\u662f <strong>rngSource<\/strong>\uff0c\u5b9e\u73b0\u4e86\u63a5\u53e3 <strong>Source<\/strong>\u3002<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">type<\/span> <span class=\"nx\">rngSource<\/span> <span class=\"kd\">struct<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">tap<\/span>  <span class=\"kt\">int<\/span>           <span class=\"c1\">\/\/ index into vec<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">feed<\/span> <span class=\"kt\">int<\/span>           <span class=\"c1\">\/\/ index into vec<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">vec<\/span>  <span class=\"p\">[<\/span><span class=\"nx\">rngLen<\/span><span class=\"p\">]<\/span><span class=\"kt\">int64<\/span> <span class=\"c1\">\/\/ current feedback register<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>\u770b\u4e0b\u63a5\u53e3 <strong>Source<\/strong>\u7684\u5b9a\u4e49\u3002<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ A Source represents a source of uniformly-distributed<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ pseudo-random int64 values in the range [0, 1&lt;&lt;63).<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ A Source is not safe for concurrent use by multiple goroutines.<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">type<\/span> <span class=\"nx\">Source<\/span> <span class=\"kd\">interface<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nf\">Int63<\/span><span class=\"p\">()<\/span> <span class=\"kt\">int64<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nf\">Seed<\/span><span class=\"p\">(<\/span><span class=\"nx\">seed<\/span> <span class=\"kt\">int64<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p><u><font color=*#0099ff size=4 face=\"\u9ed1\u4f53\">\u4ece newSource \u4e2d\uff0c\u53ef\u4ee5\u770b\u5230\u8c03\u7528\u4e86 <code>rng.Seed(seed)<\/code> \uff0c\u5373 rngSource \u7684 Seed \uff0c\u8fd9\u4e2a\u5c31\u662f\u968f\u673a\u5668\u521d\u59cb\u5316\u7684\u6838\u5fc3\u51fd\u6570\u3002<\/font><\/u><\/p>\n<details>\n  <summary>\ud83e\udef5\ud83d\ude0e<\/summary>\n  <div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">const<\/span> <span class=\"p\">(<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">rngLen<\/span>   <span class=\"p\">=<\/span> <span class=\"mi\">607<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">rngTap<\/span>   <span class=\"p\">=<\/span> <span class=\"mi\">273<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">rngMax<\/span>   <span class=\"p\">=<\/span> <span class=\"mi\">1<\/span> <span class=\"o\">&lt;&lt;<\/span> <span class=\"mi\">63<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">rngMask<\/span>  <span class=\"p\">=<\/span> <span class=\"nx\">rngMax<\/span> <span class=\"o\">-<\/span> <span class=\"mi\">1<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">int32max<\/span> <span class=\"p\">=<\/span> <span class=\"p\">(<\/span><span class=\"mi\">1<\/span> <span class=\"o\">&lt;&lt;<\/span> <span class=\"mi\">31<\/span><span class=\"p\">)<\/span> <span class=\"o\">-<\/span> <span class=\"mi\">1<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ Seed uses the provided seed value to initialize the generator to a deterministic state.<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"p\">(<\/span><span class=\"nx\">rng<\/span> <span class=\"o\">*<\/span><span class=\"nx\">rngSource<\/span><span class=\"p\">)<\/span> <span class=\"nf\">Seed<\/span><span class=\"p\">(<\/span><span class=\"nx\">seed<\/span> <span class=\"kt\">int64<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">rng<\/span><span class=\"p\">.<\/span><span class=\"nx\">tap<\/span> <span class=\"p\">=<\/span> <span class=\"mi\">0<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">rng<\/span><span class=\"p\">.<\/span><span class=\"nx\">feed<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">rngLen<\/span> <span class=\"o\">-<\/span> <span class=\"nx\">rngTap<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">seed<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">seed<\/span> <span class=\"o\">%<\/span> <span class=\"nx\">int32max<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">if<\/span> <span class=\"nx\">seed<\/span> <span class=\"p\">&lt;<\/span> <span class=\"mi\">0<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"nx\">seed<\/span> <span class=\"o\">+=<\/span> <span class=\"nx\">int32max<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">if<\/span> <span class=\"nx\">seed<\/span> <span class=\"o\">==<\/span> <span class=\"mi\">0<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"nx\">seed<\/span> <span class=\"p\">=<\/span> <span class=\"mi\">89482311<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">x<\/span> <span class=\"o\">:=<\/span> <span class=\"nb\">int32<\/span><span class=\"p\">(<\/span><span class=\"nx\">seed<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">for<\/span> <span class=\"nx\">i<\/span> <span class=\"o\">:=<\/span> <span class=\"o\">-<\/span><span class=\"mi\">20<\/span><span class=\"p\">;<\/span> <span class=\"nx\">i<\/span> <span class=\"p\">&lt;<\/span> <span class=\"nx\">rngLen<\/span><span class=\"p\">;<\/span> <span class=\"nx\">i<\/span><span class=\"o\">++<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"nx\">x<\/span> <span class=\"p\">=<\/span> <span class=\"nf\">seedrand<\/span><span class=\"p\">(<\/span><span class=\"nx\">x<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"k\">if<\/span> <span class=\"nx\">i<\/span> <span class=\"o\">&gt;=<\/span> <span class=\"mi\">0<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t\t<span class=\"kd\">var<\/span> <span class=\"nx\">u<\/span> <span class=\"kt\">int64<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t\t<span class=\"nx\">u<\/span> <span class=\"p\">=<\/span> <span class=\"nb\">int64<\/span><span class=\"p\">(<\/span><span class=\"nx\">x<\/span><span class=\"p\">)<\/span> <span class=\"o\">&lt;&lt;<\/span> <span class=\"mi\">40<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t\t<span class=\"nx\">x<\/span> <span class=\"p\">=<\/span> <span class=\"nf\">seedrand<\/span><span class=\"p\">(<\/span><span class=\"nx\">x<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t\t<span class=\"nx\">u<\/span> <span class=\"p\">^=<\/span> <span class=\"nb\">int64<\/span><span class=\"p\">(<\/span><span class=\"nx\">x<\/span><span class=\"p\">)<\/span> <span class=\"o\">&lt;&lt;<\/span> <span class=\"mi\">20<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t\t<span class=\"nx\">x<\/span> <span class=\"p\">=<\/span> <span class=\"nf\">seedrand<\/span><span class=\"p\">(<\/span><span class=\"nx\">x<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t\t<span class=\"nx\">u<\/span> <span class=\"p\">^=<\/span> <span class=\"nb\">int64<\/span><span class=\"p\">(<\/span><span class=\"nx\">x<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t\t<span class=\"nx\">u<\/span> <span class=\"p\">^=<\/span> <span class=\"nx\">rngCooked<\/span><span class=\"p\">[<\/span><span class=\"nx\">i<\/span><span class=\"p\">]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t\t<span class=\"nx\">rng<\/span><span class=\"p\">.<\/span><span class=\"nx\">vec<\/span><span class=\"p\">[<\/span><span class=\"nx\">i<\/span><span class=\"p\">]<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">u<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ seed rng x[n+1] = 48271 * x[n] mod (2**31 - 1)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"nf\">seedrand<\/span><span class=\"p\">(<\/span><span class=\"nx\">x<\/span> <span class=\"kt\">int32<\/span><span class=\"p\">)<\/span> <span class=\"kt\">int32<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"kd\">const<\/span> <span class=\"p\">(<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"nx\">A<\/span> <span class=\"p\">=<\/span> <span class=\"mi\">48271<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"nx\">Q<\/span> <span class=\"p\">=<\/span> <span class=\"mi\">44488<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"nx\">R<\/span> <span class=\"p\">=<\/span> <span class=\"mi\">3399<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">hi<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">x<\/span> <span class=\"o\">\/<\/span> <span class=\"nx\">Q<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">lo<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">x<\/span> <span class=\"o\">%<\/span> <span class=\"nx\">Q<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">x<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">A<\/span><span class=\"o\">*<\/span><span class=\"nx\">lo<\/span> <span class=\"o\">-<\/span> <span class=\"nx\">R<\/span><span class=\"o\">*<\/span><span class=\"nx\">hi<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">if<\/span> <span class=\"nx\">x<\/span> <span class=\"p\">&lt;<\/span> <span class=\"mi\">0<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"nx\">x<\/span> <span class=\"o\">+=<\/span> <span class=\"nx\">int32max<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">return<\/span> <span class=\"nx\">x<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/div>\n<\/details>\n<p>\u901a\u8fc7\u903b\u8f91\u53ef\u4ee5\u770b\u51fa\uff0c\u8c03\u7528 <strong>rand.Seed<\/strong> \u6765\u8bbe\u7f6e\u79cd\u5b50, \u5176\u5b9e\u5c31\u662f\u7ed9 <strong>rng.vec<\/strong> \u7684 <strong>607<\/strong> \u4e2a\u69fd\u8bbe\u7f6e\u5bf9\u5e94\u7684\u503c\u3002\u901a\u8fc7\u4e0a\u9762\u7684\u6e90\u7801\u90a3\u53ef\u4ee5\u770b\u51fa\u6765, <strong>rand.Seed<\/strong> \u4f1a\u8c03\u7528\u4e00\u4e2a <strong>seedrand<\/strong> \u7684\u51fd\u6570, \u6765\u8ba1\u7b97\u5bf9\u5e94\u69fd\u7684\u503c\u3002\u8fd9\u4e2a\u51fd\u6570\u7684\u8ba1\u7b97\u7ed3\u679c\u5e76\u4e0d\u662f\u968f\u673a\u7684\uff0c\u800c\u662f\u6839\u636e seed \u5b9e\u9645\u7b97\u51fa\u6765\u7684\uff0c\u53e6\u5916\u8fd9\u4e2a\u51fd\u6570\u5e76\u4e0d\u662f\u968f\u4fbf\u5199\u7684\uff0c\u662f\u6709\u76f8\u5173\u7684\u6570\u5b66\u8bc1\u660e\u7684\u3002\n\u8fd9\u4e5f\u5bfc\u81f4\u4e86\u76f8\u540c\u7684 seed\uff0c\u6700\u7ec8\u8bbe\u7f6e\u5230 <strong>rng.vec<\/strong> \u91cc\u9762\u7684\u503c\u662f\u76f8\u540c\u7684\u3002\n\u603b\u7ed3\u4e0b\uff0c\u968f\u673a\u5668\u521d\u59cb\u5316\u7684\u903b\u8f91\u5176\u5b9e\u5c31\u662f\u4e3a\u4e86\u8fdb\u884c <strong>rng.tap<\/strong>\u3001<strong>rng.feed<\/strong>\u3001 <strong>rng.vec<\/strong> \u7684\u521d\u59cb\u5316\u5de5\u4f5c\u3002\n\u5176\u4e2d\uff0c\u9700\u8981\u7279\u522b\u6ce8\u610f\u7684\u662f\uff1a\n<strong>\u76f8\u540c\u7684seed\u79cd\u5b50<\/strong> \u6216\u8005 <strong>seed\u79cd\u5b50\u53d6\u6a21int32\u6700\u5927\u503c\u540e\u76f8\u7b49<\/strong>\uff1b\n\u8fd9\u4e24\u79cd\u60c5\u51b5\u90fd\u4f1a\u5bfc\u81f4\u6700\u7ec8\u8bbe\u7f6e\u5230 rng.vec \u91cc\u9762\u7684\u503c\u662f\u76f8\u540c\u7684\u3002<\/p>\n<hr>\n<p>\u4ee5\u4e0a\u5c31\u662f\u968f\u673a\u5668\u521d\u59cb\u5316\uff0c\u63a5\u4e0b\u6765\u770b\u4e0b\u968f\u673a\u6570\u662f\u5982\u4f55\u4ea7\u751f\u7684\u3002\n<strong>\u4ece<code>r.Intn(314)<\/code> \u5f00\u59cb\u89e3\u6790\u3002<\/strong>\n\u4ee5 <code>rand.Intn()<\/code> \u4e3a\u4f8b\uff0c\u770b\u4e0b\u5177\u4f53\u7684\u5b9e\u73b0\u3002<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ Intn returns, as an int, a non-negative pseudo-random number in the half-open interval [0,n).<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ It panics if n &lt;= 0.<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"p\">(<\/span><span class=\"nx\">r<\/span> <span class=\"o\">*<\/span><span class=\"nx\">Rand<\/span><span class=\"p\">)<\/span> <span class=\"nf\">Intn<\/span><span class=\"p\">(<\/span><span class=\"nx\">n<\/span> <span class=\"kt\">int<\/span><span class=\"p\">)<\/span> <span class=\"kt\">int<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">if<\/span> <span class=\"nx\">n<\/span> <span class=\"o\">&lt;=<\/span> <span class=\"mi\">0<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"nb\">panic<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;invalid argument to Intn&#34;<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">if<\/span> <span class=\"nx\">n<\/span> <span class=\"o\">&lt;=<\/span> <span class=\"mi\">1<\/span><span class=\"o\">&lt;&lt;<\/span><span class=\"mi\">31<\/span><span class=\"o\">-<\/span><span class=\"mi\">1<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"k\">return<\/span> <span class=\"nb\">int<\/span><span class=\"p\">(<\/span><span class=\"nx\">r<\/span><span class=\"p\">.<\/span><span class=\"nf\">Int31n<\/span><span class=\"p\">(<\/span><span class=\"nb\">int32<\/span><span class=\"p\">(<\/span><span class=\"nx\">n<\/span><span class=\"p\">)))<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">return<\/span> <span class=\"nb\">int<\/span><span class=\"p\">(<\/span><span class=\"nx\">r<\/span><span class=\"p\">.<\/span><span class=\"nf\">Int63n<\/span><span class=\"p\">(<\/span><span class=\"nb\">int64<\/span><span class=\"p\">(<\/span><span class=\"nx\">n<\/span><span class=\"p\">)))<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>\u67e5\u770b\u6e90\u7801\u53ef\u4e86\u89e3\u5230\uff0c\u5c0f\u4e8e\u7b49\u4e8e <code>MaxInt32<\/code> \u7684\u503c\u8c03\u7528\u7684\u662f <code>r.Int31n<\/code> \u3002<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ Int31n returns, as an int32, a non-negative pseudo-random number in the half-open interval [0,n).<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ It panics if n &lt;= 0.<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"p\">(<\/span><span class=\"nx\">r<\/span> <span class=\"o\">*<\/span><span class=\"nx\">Rand<\/span><span class=\"p\">)<\/span> <span class=\"nf\">Int31n<\/span><span class=\"p\">(<\/span><span class=\"nx\">n<\/span> <span class=\"kt\">int32<\/span><span class=\"p\">)<\/span> <span class=\"kt\">int32<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">if<\/span> <span class=\"nx\">n<\/span> <span class=\"o\">&lt;=<\/span> <span class=\"mi\">0<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"nb\">panic<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;invalid argument to Int31n&#34;<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">if<\/span> <span class=\"nx\">n<\/span><span class=\"o\">&amp;<\/span><span class=\"p\">(<\/span><span class=\"nx\">n<\/span><span class=\"o\">-<\/span><span class=\"mi\">1<\/span><span class=\"p\">)<\/span> <span class=\"o\">==<\/span> <span class=\"mi\">0<\/span> <span class=\"p\">{<\/span> <span class=\"c1\">\/\/ n is power of two, can mask<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"k\">return<\/span> <span class=\"nx\">r<\/span><span class=\"p\">.<\/span><span class=\"nf\">Int31<\/span><span class=\"p\">()<\/span> <span class=\"o\">&amp;<\/span> <span class=\"p\">(<\/span><span class=\"nx\">n<\/span> <span class=\"o\">-<\/span> <span class=\"mi\">1<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">max<\/span> <span class=\"o\">:=<\/span> <span class=\"nb\">int32<\/span><span class=\"p\">((<\/span><span class=\"mi\">1<\/span> <span class=\"o\">&lt;&lt;<\/span> <span class=\"mi\">31<\/span><span class=\"p\">)<\/span> <span class=\"o\">-<\/span> <span class=\"mi\">1<\/span> <span class=\"o\">-<\/span> <span class=\"p\">(<\/span><span class=\"mi\">1<\/span><span class=\"o\">&lt;&lt;<\/span><span class=\"mi\">31<\/span><span class=\"p\">)<\/span><span class=\"o\">%<\/span><span class=\"nb\">uint32<\/span><span class=\"p\">(<\/span><span class=\"nx\">n<\/span><span class=\"p\">))<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">v<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">r<\/span><span class=\"p\">.<\/span><span class=\"nf\">Int31<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">for<\/span> <span class=\"nx\">v<\/span> <span class=\"p\">&gt;<\/span> <span class=\"nx\">max<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"nx\">v<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">r<\/span><span class=\"p\">.<\/span><span class=\"nf\">Int31<\/span><span class=\"p\">()<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">return<\/span> <span class=\"nx\">v<\/span> <span class=\"o\">%<\/span> <span class=\"nx\">n<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>\u5982\u679c\u4f20\u5165\u7684\u503c\u662f2\u7684\u5e42\u6b21\u65b9\uff0c\u5219\u8c03\u7528\u7684 <code>r.Int31() &amp; (n - 1)<\/code> \uff1b<\/p>\n<p>\u56e0\u4e3a\u4f20\u5165\u7684314\u4e0d\u662f2\u7684\u5e42\u6b21\u65b9\uff0c\u6240\u4ee5\u8d70\u7684\u662f <code>max := int32((1 &lt;&lt; 31) - 1 - (1&lt;&lt;31)%uint32(n))<\/code> \u4e0b\u9762\u7684\u903b\u8f91\u3002<\/p>\n<p>\u9488\u5bf9 max \u8fd9\u4e2a\u903b\u8f91\uff0c\u9700\u8981\u7406\u89e3\u5b83\u7684\u7528\u9014\uff0c\u5b83\u5176\u5b9e\u662f\u5c06 <strong>int32<\/strong>  <code>0, (1 &lt;&lt; 31) - 1<\/code> \u8303\u56f4\u5185\u5c3e\u90e8\uff0c\u201c\u53d6\u6a21\u540e\u201d\uff0c\u4e0d\u80fd\u8986\u76d6  <code>[0, n) <\/code> \u7684\u6570\u503c\u53bb\u6389\uff0c\u8fd9\u6837\u5c31\u4fdd\u8bc1\u4e86  <code>[0, n) <\/code> \u5185\u5404\u4e2a\u6570\u503c\u51fa\u73b0\u7684\u6982\u7387\u662f\u4e00\u81f4\u7684\u3002\u4e3e\u4f8b\u5982\u4e0b\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"kd\">var<\/span> <span class=\"nx\">n<\/span> <span class=\"kt\">int32<\/span> <span class=\"p\">=<\/span> <span class=\"mi\">314<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">tail<\/span> <span class=\"o\">:=<\/span> <span class=\"p\">(<\/span><span class=\"mi\">1<\/span> <span class=\"o\">&lt;&lt;<\/span> <span class=\"mi\">31<\/span><span class=\"p\">)<\/span> <span class=\"o\">%<\/span> <span class=\"nb\">uint32<\/span><span class=\"p\">(<\/span><span class=\"nx\">n<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">max<\/span> <span class=\"o\">:=<\/span> <span class=\"nb\">int32<\/span><span class=\"p\">((<\/span><span class=\"mi\">1<\/span> <span class=\"o\">&lt;&lt;<\/span> <span class=\"mi\">31<\/span><span class=\"p\">)<\/span> <span class=\"o\">-<\/span> <span class=\"mi\">1<\/span> <span class=\"o\">-<\/span> <span class=\"p\">(<\/span><span class=\"mi\">1<\/span><span class=\"o\">&lt;&lt;<\/span><span class=\"mi\">31<\/span><span class=\"p\">)<\/span><span class=\"o\">%<\/span><span class=\"nb\">uint32<\/span><span class=\"p\">(<\/span><span class=\"nx\">n<\/span><span class=\"p\">))<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">fmt<\/span><span class=\"p\">.<\/span><span class=\"nf\">Println<\/span><span class=\"p\">(<\/span><span class=\"nx\">tail<\/span><span class=\"p\">)<\/span>    <span class=\"c1\">\/\/ 282<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">fmt<\/span><span class=\"p\">.<\/span><span class=\"nf\">Println<\/span><span class=\"p\">(<\/span><span class=\"nx\">max<\/span><span class=\"p\">)<\/span>     <span class=\"c1\">\/\/ 2147483365<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">fmt<\/span><span class=\"p\">.<\/span><span class=\"nf\">Println<\/span><span class=\"p\">(<\/span><span class=\"nx\">max<\/span> <span class=\"o\">%<\/span> <span class=\"nx\">n<\/span><span class=\"p\">)<\/span> <span class=\"c1\">\/\/ 313<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>\u7ee7\u7eed\u5f80\u4e0b\u770b\u903b\u8f91\uff0c\u65e0\u8bba\u662f\u4e0d\u662f2\u7684\u5e42\u6b21\u65b9\uff0c\u6700\u7ec8\u90fd\u4f1a\u8c03\u7528\u5230   <code>r.Int31() <\/code> \uff0c\u6240\u4ee5\u9700\u8981\u770b <code>r.Int31() <\/code> \u7684\u5177\u4f53\u5b9e\u73b0\u3002<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ Int31 returns a non-negative pseudo-random 31-bit integer as an int32.<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"p\">(<\/span><span class=\"nx\">r<\/span> <span class=\"o\">*<\/span><span class=\"nx\">Rand<\/span><span class=\"p\">)<\/span> <span class=\"nf\">Int31<\/span><span class=\"p\">()<\/span> <span class=\"kt\">int32<\/span> <span class=\"p\">{<\/span> <span class=\"k\">return<\/span> <span class=\"nb\">int32<\/span><span class=\"p\">(<\/span><span class=\"nx\">r<\/span><span class=\"p\">.<\/span><span class=\"nf\">Int63<\/span><span class=\"p\">()<\/span> <span class=\"o\">&gt;&gt;<\/span> <span class=\"mi\">32<\/span><span class=\"p\">)<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p><code>r.Int31() <\/code>  \u4e2d\u8c03\u7528\u7684\u662f   <code>r.Int63() <\/code> \uff0c\u7136\u540e\u53d6\u7ed3\u679c\u7684\u9ad831\u4f4d\u4f5c\u4e3a <strong>int32<\/strong> \u968f\u673a\u503c\uff0c\u4e0b\u9762\u770b <code>r.Int63() <\/code> \u7684\u5b9e\u73b0\u3002<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ Int63 returns a non-negative pseudo-random 63-bit integer as an int64.<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"p\">(<\/span><span class=\"nx\">r<\/span> <span class=\"o\">*<\/span><span class=\"nx\">Rand<\/span><span class=\"p\">)<\/span> <span class=\"nf\">Int63<\/span><span class=\"p\">()<\/span> <span class=\"kt\">int64<\/span> <span class=\"p\">{<\/span> <span class=\"k\">return<\/span> <span class=\"nx\">r<\/span><span class=\"p\">.<\/span><span class=\"nx\">src<\/span><span class=\"p\">.<\/span><span class=\"nf\">Int63<\/span><span class=\"p\">()<\/span> <span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>\u53ef\u4ee5\u770b\u5230\uff0c\u6700\u7ec8\u8c03\u7528\u7684\u662f <code>r.src.Int63()<\/code> \u3002<\/p>\n<p>\u770b\u4e0bRand\u7684\u5b9a\u4e49\uff0c\u56e0\u4e3a\u4e0a\u9762\u5df2\u7ecf\u5206\u6790\u51fa\u4e86Rand\u7684src\u7684\u5177\u4f53\u5b9e\u73b0\u5c31\u662f <strong>rngSource<\/strong>\u3002<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ A Rand is a source of random numbers.<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">type<\/span> <span class=\"nx\">Rand<\/span> <span class=\"kd\">struct<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">src<\/span> <span class=\"nx\">Source<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">s64<\/span> <span class=\"nx\">Source64<\/span> <span class=\"c1\">\/\/ non-nil if src is source64<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"c1\">\/\/ readVal contains remainder of 63-bit integer used for bytes<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"c1\">\/\/ generation during most recent Read call.<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"c1\">\/\/ It is saved so next Read call can start where the previous<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"c1\">\/\/ one finished.<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">readVal<\/span> <span class=\"kt\">int64<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"c1\">\/\/ readPos indicates the number of low-order bytes of readVal<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"c1\">\/\/ that are still valid.<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">readPos<\/span> <span class=\"kt\">int8<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>\u56e0\u6b64\uff0c\u968f\u673a\u6570\u7684\u4ea7\u751f\u8c03\u7528\u7684\u5c31\u662f <strong>rngSource<\/strong> \u7ed3\u6784\u4f53\u7684 <strong>Int63<\/strong> \u51fd\u6570\u3002<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ Int63 returns a non-negative pseudo-random 63-bit integer as an int64.<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"p\">(<\/span><span class=\"nx\">rng<\/span> <span class=\"o\">*<\/span><span class=\"nx\">rngSource<\/span><span class=\"p\">)<\/span> <span class=\"nf\">Int63<\/span><span class=\"p\">()<\/span> <span class=\"kt\">int64<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">return<\/span> <span class=\"nb\">int64<\/span><span class=\"p\">(<\/span><span class=\"nx\">rng<\/span><span class=\"p\">.<\/span><span class=\"nf\">Uint64<\/span><span class=\"p\">()<\/span> <span class=\"o\">&amp;<\/span> <span class=\"nx\">rngMask<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>\u5176\u4e2d <strong>rngMask<\/strong> \u8868\u793a Int64 \u7684\u6700\u5927\u503c\uff0c\u4f5c\u7528\u662f\u4f5c\u4e3a\u63a9\u7801\u3002<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"nx\">rngMax<\/span>   <span class=\"p\">=<\/span> <span class=\"mi\">1<\/span> <span class=\"o\">&lt;&lt;<\/span> <span class=\"mi\">63<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">rngMask<\/span>  <span class=\"p\">=<\/span> <span class=\"nx\">rngMax<\/span> <span class=\"o\">-<\/span> <span class=\"mi\">1<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p><u><font color=*#0099ff size=4 face=\"\u9ed1\u4f53\">\u800c  <code>rng.Uint64()<\/code> \uff0c\u5219\u662f\u4ea7\u751f\u968f\u673a\u6570\u7684\u6838\u5fc3\u51fd\u6570\uff1b\u5b83\u7684\u6838\u5fc3\u903b\u8f91\u5c31\u662f\u4ece\u6570\u7ec4 <code>rngSource.vec<\/code> \u4e2d\u53d6\u51fa\u968f\u673a\u6570\u3002<\/font><\/u><\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"c1\">\/\/ Uint64 returns a non-negative pseudo-random 64-bit integer as an uint64.<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"kd\">func<\/span> <span class=\"p\">(<\/span><span class=\"nx\">rng<\/span> <span class=\"o\">*<\/span><span class=\"nx\">rngSource<\/span><span class=\"p\">)<\/span> <span class=\"nf\">Uint64<\/span><span class=\"p\">()<\/span> <span class=\"kt\">uint64<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">rng<\/span><span class=\"p\">.<\/span><span class=\"nx\">tap<\/span><span class=\"o\">--<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">if<\/span> <span class=\"nx\">rng<\/span><span class=\"p\">.<\/span><span class=\"nx\">tap<\/span> <span class=\"p\">&lt;<\/span> <span class=\"mi\">0<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"nx\">rng<\/span><span class=\"p\">.<\/span><span class=\"nx\">tap<\/span> <span class=\"o\">+=<\/span> <span class=\"nx\">rngLen<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">rng<\/span><span class=\"p\">.<\/span><span class=\"nx\">feed<\/span><span class=\"o\">--<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">if<\/span> <span class=\"nx\">rng<\/span><span class=\"p\">.<\/span><span class=\"nx\">feed<\/span> <span class=\"p\">&lt;<\/span> <span class=\"mi\">0<\/span> <span class=\"p\">{<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t\t<span class=\"nx\">rng<\/span><span class=\"p\">.<\/span><span class=\"nx\">feed<\/span> <span class=\"o\">+=<\/span> <span class=\"nx\">rngLen<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"p\">}<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">x<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">rng<\/span><span class=\"p\">.<\/span><span class=\"nx\">vec<\/span><span class=\"p\">[<\/span><span class=\"nx\">rng<\/span><span class=\"p\">.<\/span><span class=\"nx\">feed<\/span><span class=\"p\">]<\/span> <span class=\"o\">+<\/span> <span class=\"nx\">rng<\/span><span class=\"p\">.<\/span><span class=\"nx\">vec<\/span><span class=\"p\">[<\/span><span class=\"nx\">rng<\/span><span class=\"p\">.<\/span><span class=\"nx\">tap<\/span><span class=\"p\">]<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"nx\">rng<\/span><span class=\"p\">.<\/span><span class=\"nx\">vec<\/span><span class=\"p\">[<\/span><span class=\"nx\">rng<\/span><span class=\"p\">.<\/span><span class=\"nx\">feed<\/span><span class=\"p\">]<\/span> <span class=\"p\">=<\/span> <span class=\"nx\">x<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\t<span class=\"k\">return<\/span> <span class=\"nb\">uint64<\/span><span class=\"p\">(<\/span><span class=\"nx\">x<\/span><span class=\"p\">)<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"p\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>\u5b9e\u9645\u4e0a\uff0c\u8c03\u7528 <code>Intn(), Int31n(), Int63(), Int63n()<\/code> \u7b49\u5176\u4ed6\u968f\u673a\u51fd\u6570\uff0c\u6700\u7ec8\u8c03\u7528\u5230\u90fd\u662f\u51fd\u6570 <code>rngSource.Uint64()<\/code> \u3002<strong>\u53ef\u4ee5\u770b\u5230\u6bcf\u6b21\u8c03\u7528\u5c31\u662f\u5229\u7528 rng.feed, rng.tap \u4ece rng.vec \u4e2d\u53d6\u5230\u4e24\u4e2a\u503c\u76f8\u52a0\u7684\u7ed3\u679c\u8fd4\u56de\uff0c\u540c\u65f6\u8fd9\u4e2a\u7ed3\u679c\u53c8\u91cd\u65b0\u653e\u5165 rng.vec<\/strong>\u3002\u8fd9\u6837\u505a\u7684\u76ee\u7684\u662f\uff0c\u8ba9\u968f\u673a\u6570\u66f4\u52a0\u4e30\u5bcc\u968f\u673a\uff0c\u800c\u4e0d\u662f\u4ec5\u5c40\u9650\u4e8e rng.vec \u6570\u7ec4\u4e2d\u7684\u503c\u3002<\/p>\n<h2 id=\"\u6e90\u7801\u603b\u7ed3\">\u6e90\u7801\u603b\u7ed3\n<\/h2><p>\u901a\u8fc7\u4ee5\u4e0a\u7684\u6e90\u7801\u5206\u6790\uff0c\u53ef\u4ee5\u603b\u7ed3\u51fa\u4ee5\u4e0b\u51e0\u70b9\uff1a<\/p>\n<ol>\n<li><strong>rand.New \u521d\u59cb\u5316\u51fa\u6765\u7684 rand \u4e0d\u662f\u5e76\u53d1\u5b89\u5168\u7684\u3002<\/strong> \u56e0\u4e3a\u6bcf\u6b21\u5229\u7528 rng.feed, rng.tap \u4ece rng.vec \u4e2d\u53d6\u5230\u968f\u673a\u503c\u540e\u4f1a\u5c06\u968f\u673a\u503c\u91cd\u65b0\u653e\u5165 rng.vec\uff0c\u5f53\u591a goroutine \u540c\u65f6\u8c03\u7528\u65f6\u5c31\u4f1a\u6709\u6570\u636e\u7ade\u4e89\u95ee\u9898\u3002\u5982\u679c\u60f3\u5e76\u53d1\u5b89\u5168\uff0c\u53ef\u4ee5\u4f7f\u7528\u5168\u5c40\u7684\u968f\u673a\u6570\u53d1\u751f\u5668 rand.globalRand\uff0c\u5b83\u662f\u57fa\u4e8elockedSource\u5b9e\u73b0\u7684\uff0c\u8fdb\u884c\u4e86\u52a0\u9501\u7684\u903b\u8f91\u3002<\/li>\n<li><strong>\u76f8\u540cseed\u79cd\u5b50\uff0c\u6bcf\u6b21\u8fd0\u884c\u7684\u7ed3\u679c\u662f\u4e00\u6837\u7684\u3002<\/strong> \u56e0\u4e3a\u968f\u673a\u6570\u662f\u4ece rng.vec \u6570\u7ec4\u4e2d\u53d6\u51fa\u6765\u7684\uff0c\u8fd9\u4e2a\u6570\u7ec4\u662f\u6839\u636e\u79cd\u5b50\u751f\u6210\u7684\uff0c\u76f8\u540c\u7684\u79cd\u5b50\u751f\u6210\u7684 rng.vec \u6570\u7ec4\u662f\u76f8\u540c\u7684\u3002<\/li>\n<li><strong>\u4e0d\u540cseed\u79cd\u5b50\uff0c\u6bcf\u6b21\u8fd0\u884c\u7684\u7ed3\u679c\u53ef\u80fd\u4e00\u6837\u3002<\/strong> \u56e0\u4e3a\u6839\u636e\u79cd\u5b50\u751f\u6210 rng.vec \u6570\u7ec4\u65f6\u4f1a\u6709\u4e00\u4e2a\u5bf9int32\u6700\u5927\u503c\u53d6\u6a21\u7684\u64cd\u4f5c\uff0c\u6a21\u540e\u7684\u7ed3\u679c\u53ef\u80fd\u76f8\u540c\uff0c\u4e5f\u5c31\u662f\u4e24\u4e2a\u79cd\u5b50\u5982\u679c\u76f8\u5deeint32\u7684\u6700\u5927\u503c\uff0c\u5c31\u4f1a\u5bfc\u81f4 rng.vec \u6570\u7ec4\u76f8\u540c\u3002<\/li>\n<\/ol>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"nx\">r1<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">rand<\/span><span class=\"p\">.<\/span><span class=\"nf\">New<\/span><span class=\"p\">(<\/span><span class=\"nx\">rand<\/span><span class=\"p\">.<\/span><span class=\"nf\">NewSource<\/span><span class=\"p\">(<\/span><span class=\"mi\">1111<\/span><span class=\"p\">))<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">r2<\/span> <span class=\"o\">:=<\/span> <span class=\"nx\">rand<\/span><span class=\"p\">.<\/span><span class=\"nf\">New<\/span><span class=\"p\">(<\/span><span class=\"nx\">rand<\/span><span class=\"p\">.<\/span><span class=\"nf\">NewSource<\/span><span class=\"p\">(<\/span><span class=\"mi\">1111<\/span> <span class=\"o\">+<\/span> <span class=\"nx\">math<\/span><span class=\"p\">.<\/span><span class=\"nx\">MaxInt32<\/span><span class=\"p\">))<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">fmt<\/span><span class=\"p\">.<\/span><span class=\"nf\">Println<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;\u7b2c\u4e00\u4e2a\u968f\u673a\u5668\uff1a&#34;<\/span><span class=\"p\">,<\/span> <span class=\"nx\">r1<\/span><span class=\"p\">.<\/span><span class=\"nf\">Intn<\/span><span class=\"p\">(<\/span><span class=\"mi\">10000<\/span><span class=\"p\">))<\/span>  <span class=\"c1\">\/\/ \u7b2c\u4e00\u4e2a\u968f\u673a\u5668\uff1a 9241<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">fmt<\/span><span class=\"p\">.<\/span><span class=\"nf\">Println<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;\u7b2c\u4e00\u4e2a\u968f\u673a\u5668\uff1a&#34;<\/span><span class=\"p\">,<\/span> <span class=\"nx\">r1<\/span><span class=\"p\">.<\/span><span class=\"nf\">Intn<\/span><span class=\"p\">(<\/span><span class=\"mi\">10000<\/span><span class=\"p\">))<\/span>  <span class=\"c1\">\/\/ \u7b2c\u4e00\u4e2a\u968f\u673a\u5668\uff1a 8842<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">fmt<\/span><span class=\"p\">.<\/span><span class=\"nf\">Println<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;\u7b2c\u4e00\u4e2a\u968f\u673a\u5668\uff1a&#34;<\/span><span class=\"p\">,<\/span> <span class=\"nx\">r1<\/span><span class=\"p\">.<\/span><span class=\"nf\">Intn<\/span><span class=\"p\">(<\/span><span class=\"mi\">10000<\/span><span class=\"p\">))<\/span>  <span class=\"c1\">\/\/ \u7b2c\u4e00\u4e2a\u968f\u673a\u5668\uff1a 2221<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\">\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">fmt<\/span><span class=\"p\">.<\/span><span class=\"nf\">Println<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;\u7b2c\u4e8c\u4e2a\u968f\u673a\u5668\uff1a&#34;<\/span><span class=\"p\">,<\/span> <span class=\"nx\">r2<\/span><span class=\"p\">.<\/span><span class=\"nf\">Intn<\/span><span class=\"p\">(<\/span><span class=\"mi\">10000<\/span><span class=\"p\">))<\/span>  <span class=\"c1\">\/\/ \u7b2c\u4e8c\u4e2a\u968f\u673a\u5668\uff1a 9241<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">fmt<\/span><span class=\"p\">.<\/span><span class=\"nf\">Println<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;\u7b2c\u4e8c\u4e2a\u968f\u673a\u5668\uff1a&#34;<\/span><span class=\"p\">,<\/span> <span class=\"nx\">r2<\/span><span class=\"p\">.<\/span><span class=\"nf\">Intn<\/span><span class=\"p\">(<\/span><span class=\"mi\">10000<\/span><span class=\"p\">))<\/span>  <span class=\"c1\">\/\/ \u7b2c\u4e8c\u4e2a\u968f\u673a\u5668\uff1a 8842<\/span>\n<\/span><\/span><span class=\"line\"><span class=\"cl\"><span class=\"nx\">fmt<\/span><span class=\"p\">.<\/span><span class=\"nf\">Println<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;\u7b2c\u4e8c\u4e2a\u968f\u673a\u5668\uff1a&#34;<\/span><span class=\"p\">,<\/span> <span class=\"nx\">r2<\/span><span class=\"p\">.<\/span><span class=\"nf\">Intn<\/span><span class=\"p\">(<\/span><span class=\"mi\">10000<\/span><span class=\"p\">))<\/span>  <span class=\"c1\">\/\/ \u7b2c\u4e8c\u4e2a\u968f\u673a\u5668\uff1a 2221<\/span>\n<\/span><\/span><\/code><\/pre><\/div>"},{"title":"\u5f52\u6863","link":"https:\/\/hcraM41.github.io\/archives\/","pubDate":"Tue, 28 May 2019 00:00:00 +0000","guid":"https:\/\/hcraM41.github.io\/archives\/","description":{}},{"title":"\u5173\u4e8e","link":"https:\/\/hcraM41.github.io\/%E5%85%B3%E4%BA%8E\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/hcraM41.github.io\/%E5%85%B3%E4%BA%8E\/","description":"<p>This is a test page for i18n support.<\/p>\n"},{"title":"\u641c\u7d22","link":"https:\/\/hcraM41.github.io\/search\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/hcraM41.github.io\/search\/","description":{}},{"title":"\u53cb\u60c5\u94fe\u63a5","link":"https:\/\/hcraM41.github.io\/%E5%8F%8B%E6%83%85%E9%93%BE%E6%8E%A5\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/hcraM41.github.io\/%E5%8F%8B%E6%83%85%E9%93%BE%E6%8E%A5\/","description":{}}]}}